3

在我的 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

谢谢..

4

6 回答 6

3

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

文档中

所有浮点数也有有限数量的有效数字,这也决定了浮点值接近实数的准确度。Double 值具有最多 15 个十进制数字的精度,尽管内部维护最多 17 个数字。

你在争论第 16 位数字。

我有一个方便的类,可以让你看到 any 的确切double

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

于 2013-04-02T16:06:53.637 回答
2

可以用小数吗?

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

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

文章摘录:

浮点值和精度损失

请记住,浮点数只能逼近十进制数,并且浮点数的精度决定了该数字逼近十进制数的准确度。默认情况下,Double 值包含 15 位精度的十进制数字,但内部维护最多 17 位数字。浮点数的精度有几个后果: 两个浮点数在特定精度下看起来相等,因为它们的最低有效数字不同,所以比较可能不相等。如果使用十进制数,使用浮点数的数学或比较运算可能不会产生相同的结果,因为浮点数可能不完全接近十进制数。如果涉及浮点数,则值可能不会往返。如果一个操作将原始浮点数转换为另一种形式,则称一个值往返,逆运算将转换后的形式转换回浮点数,并且最终的浮点数等于原始浮点数数字。往返可能会失败,因为在转换中丢失或更改了一个或多个最低有效数字。

于 2013-04-02T16:07:28.113 回答
0

使用decimal代替,double一切都会好起来的:

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

这个问题与双值表示和精度有关。

于 2013-04-02T16:06:46.907 回答
0

double无法存储这么多的精度。decimal如果这是您想要的行为,请使用。

于 2013-04-02T16:06:50.470 回答
0

您似乎找到了一个浮点数无法正确表示的数字。

尝试使用小数:

decimal Num = 6578336356630531.0m;
string StringNum = Num.ToString("###.0");
于 2013-04-02T16:07:12.550 回答
0

没有双精度四舍五入的最大整数是 2^53 - 1,大约是 9e15,但你有 6e15,它可能会被精确地表示,但不一定。你运气不好(通常是运气不好;处理它)。如果你想活得没有这些惊喜,你必须在 c# 中使用十进制类型。

于 2013-04-02T16:13:50.670 回答