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;
sspointpart=(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?例一