Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 获取小数点的值_C++_Double - Fatal编程技术网

C++ 获取小数点的值

C++ 获取小数点的值,c++,double,C++,Double,我有一个函数,可以将双精度值转换为字符串一: inline static string StringFromNumber(double val) // suppose val = 34.5678 { long integer = (long)val; // integer = 34 long pointPart; // should be = 5678 how do I get it? } 如何获取整数和点部分的长值 添加:我想要17个数字的精度,同时丢弃零。更多示例: val=3.14

我有一个函数,可以将
双精度
值转换为
字符串
一:

inline static string StringFromNumber(double val) // suppose val = 34.5678
{
 long integer = (long)val; // integer = 34
 long pointPart; // should be = 5678  how do I get it?
}
如何获取
整数
点部分

添加:我想要17个数字的精度,同时丢弃零。更多示例:

val=3.14整数=3点部分=14

val=134.4566425814748整数=134点部分=4566425814748

到目前为止,我还没有找到任何解决办法。我怎样才能得到它

long pointPart = static_cast<long>(val*10)%10;
加上long不能容纳17位数字。它能容纳10人。 所以您可能需要一个浮点变量

加上long不能容纳17位数字。它能容纳10人。
因此,您可能需要一个浮点变量

您可以使用
modf
来分隔整数和小数部分。然后,您可以将小数部分乘以
1.0e17
,然后调用
floor
,将结果适当地四舍五入到其整数分量,然后转换为
无符号长
(小数部分永远不会为负,这允许您最大化整数类型中的位数)。最后,运行一个循环,以修剪
无符号long
上的零。例如:

inline static string StringFromNumber(double val)
{
    double intpart, fracpart;
    fracpart = round((modf(val, &intpart)) * 1.0e17);

    long int_long = static_cast<long>(intpart);
    unsigned long frac_long = static_cast<long>(fracpart);

    //trim off the zeros
    for(unsigned long divisor = 10;;divisor *= 10)
    {
        if ((frac_long / divisor) * divisor != frac_long)
        {
            frac_long = frac_long / (divisor / 10);
            break;
        }
    }

    //...more code for converting to string
}
内联静态字符串StringFromNumber(双val)
{
双积分部分,分形部分;
分形部分=圆形((modf(val和intpart))*1.0e17;
long int_long=静态_cast(intpart);
无符号长压裂长=静态压裂(压裂部分);
//去掉零
for(无符号长除数=10;除数*=10)
{
if((分形长/除数)*除数!=分形长)
{
分形长度=分形长度/(除数/10);
打破
}
}
//…更多用于转换为字符串的代码
}

请注意,如果您在64位平台上且
unsigned long
定义为64位整数类型,则此代码最多只能使用17位小数。否则,您需要将
无符号长
更改为
uint64\u t
。还要记住,由于浮点数是近似值,并且有一个乘以
1.0e17
的乘数,
fracpart
的值可能不是
val
的点部分的值。。。换句话说,在任何必要的舍入之后可能会有一些额外的数字。

您可以使用
modf
来分隔整数和小数部分。然后,您可以将小数部分乘以
1.0e17
,然后调用
floor
,将结果适当地四舍五入到其整数分量,然后转换为
无符号长
(小数部分永远不会为负,这允许您最大化整数类型中的位数)。最后,运行一个循环,以修剪
无符号long
上的零。例如:

inline static string StringFromNumber(double val)
{
    double intpart, fracpart;
    fracpart = round((modf(val, &intpart)) * 1.0e17);

    long int_long = static_cast<long>(intpart);
    unsigned long frac_long = static_cast<long>(fracpart);

    //trim off the zeros
    for(unsigned long divisor = 10;;divisor *= 10)
    {
        if ((frac_long / divisor) * divisor != frac_long)
        {
            frac_long = frac_long / (divisor / 10);
            break;
        }
    }

    //...more code for converting to string
}
内联静态字符串StringFromNumber(双val)
{
双积分部分,分形部分;
分形部分=圆形((modf(val和intpart))*1.0e17;
long int_long=静态_cast(intpart);
无符号长压裂长=静态压裂(压裂部分);
//去掉零
for(无符号长除数=10;除数*=10)
{
if((分形长/除数)*除数!=分形长)
{
分形长度=分形长度/(除数/10);
打破
}
}
//…更多用于转换为字符串的代码
}

请注意,如果您在64位平台上且
unsigned long
定义为64位整数类型,则此代码最多只能使用17位小数。否则,您需要将
无符号长
更改为
uint64\u t
。还要记住,由于浮点数是近似值,并且有一个乘以
1.0e17
的乘数,
fracpart
的值可能不是
val
的点部分的值。。。换句话说,在任何必要的四舍五入之后,可能会有一些额外的数字。

stringstream不会特别为您提供小数点,但它会将整个数字转换为字符串

std::stringstream ss;
ss << val;
/*access the newly-created string with str()*/
return ss.str();
std::stringstream-ss;

ssstringstream不会特别获得小数点,但它会将整个数字转换为字符串

std::stringstream ss;
ss << val;
/*access the newly-created string with str()*/
return ss.str();
std::stringstream-ss;

ss
pointpart=(val-整数)*小数位数是否需要
?哦,我明白了,很长,你想要多少个小数位?34.567和34.56789的点部分应该是什么?还有,如果val≥ LONG_MAX+1?你的例子和问题都是假的。34.5678不能准确地表示为双精度。检查这里:我猜您不想看到5677999999830606611794792115688323974609375作为答案
StringFromNumber
?也许您想检查
ostringstream
snprintf
lexical\u cast
。您对pointPart的定义不起作用,因为它为3.14、3.014、3.0014等提供了相同的值。
pointPart=(val-整数)*DecimalPlaceYouneed
?哦,我明白了,很长,你想要多少个小数位?34.567和34.56789的点部分应该是什么?还有,如果val≥ LONG_MAX+1?你的例子和问题都是假的。34.5678不能准确地表示为双精度。检查这里:我猜您不想看到5677999999830606611794792115688323974609375作为答案
StringFromNumber
?也许你想检查
ostringstream
snprintf
lexical_-cast
。你对pointPart的定义不起作用,因为它为3.14、3.014、3.0014等+1提供了相同的值,但这是对
静态_-cast
的风格滥用,如果你问我,只要
long(val*N)%N
就可以了。@spartan非常好,但不幸的是,它没有丢弃零discard零?示例和原因?根据这个方法->val=131414.43424234,pointPart=-83648(注意:我通过mul和div 100000得到5个空格)+1,但这是一种滥用
静态\u cast
的风格,如果你问我,只要
long(val*N)%N
就可以了。@spartan非常好,但不幸的是它没有丢弃zerosdiscard zero?例一