Tostring ("000.0")生成错误的值

本文关键字:quot 错误 Tostring | 更新日期: 2023-09-27 18:07:09

在我的c#控制台应用程序中,我想将双变量转换为字符串类型。但是结果字符串变量应该在小数点左边至少有3位,在小数点右边至少有1位。示例:3.4569应转换为"003.4"

它在上面的例子中工作,但是在接下来的转换中抛出错误的结果。

 double Num = Math.Pow((3 + Math.Sqrt(5)), N); //6578336356630531.0 for N=22
 string StringNum = Num .ToString("000.0");
. .

这结果

 StringNum ="6578336356630530.0";

但它会是…

 StringNum ="6578336356630531.0";

我如何得到这些类型的数字的确切字符串值??

 //decimal Num=Convert.ToDecimal (Math.Pow((3 + Math.Sqrt(5)), N));
 //this conversion also looses original value

谢谢. .

Tostring ("000.0")生成错误的值

问题是您存储的值正好是 6578336356630531。没有更接近6578336356630530的double值。因此,对于执行时存在的数据,输出是正确的。

来自文档:

所有浮点数都有有限的有效位数,这也决定了浮点值近似实数的精确程度。Double值的十进制精度最多为15位,但内部维护的精度上限为17位。

你在纠结第16位。

我有一个方便的类,让你看到确切的值的任何double

如果需要更高的精度,请使用decimal而不是double。注意decimal范围更小,但精度更高。

可以使用小数吗?

decimal Num = 6578336356630531.0M;
string StringNum = Num .ToString("000.0");

double是一个近似精度的浮点数。看到这里。

文章摘录:

浮点值与精度损失

记住a浮点数只能近似于十进制数浮点数的精度决定了其精确程度那个数字近似于十进制数。缺省情况下,为Double值包含15位精度的十进制数字,但最多为17位内部维护数字。浮点数的精度有几个结果:两个浮点数对于特定精度,Appear equal可能不相等因为它们的最低有效位数是不同的。一个数学或者使用浮点数的比较操作可能不会如果使用十进制数,则会产生相同的结果浮点数可能不完全近似于小数号码。如果浮点数可以往返,则值可能无法往返参与。如果操作转换一个值,则称该值为往返值将原来的浮点数转换成另一种形式,进行逆运算将转换后的形式转换回浮点数,并且最终的浮点数等于原来的浮点数号码。往返可能因为一个或多个最不重要的而失败在转换过程中会丢失或更改数字。

decimal代替double,一切都会好的:

decimal Num = 6578336356630531.0m;
string StringNum = Num.ToString("000.0");
这个问题与双值表示和精度有关。

double不能存储那么多的精度。使用decimal如果这是你想要的行为。

看来你找到了一个不能用浮点数正确表示的数字。

尝试使用十进制代替:

decimal Num = 6578336356630531.0m;
string StringNum = Num.ToString("###.0");

在双精度下不舍入的最大整数是2^53 - 1,大约是9e15,但你有6e15,它可能表示得很珍贵,但不一定。你运气不好(通常是那种运气不好;处理它)。如果你不想让这些意外发生,你必须在c#中使用十进制类型。