十进制加倍

时间:2009-12-04 14:55:35

标签: c# .net

我有以下测试代码:

decimal test1 = 0.0500000000000000045656554454M;
double test2 = (double)test1;

这导致test2在调试时显示为0.05。为什么它被舍入到2位小数?

由于

4 个答案:

答案 0 :(得分:8)

该转化的价值实际为0.050000000000000009714451465470119728706777095794677734375,如DoubleConverter所示。这是您转换后的最接近小数的精确值。

使用调试器或普通字符串格式时,通常不会显示确切的结果。

答案 1 :(得分:4)

原因是double可以包含不超过15-16个有效数字。

请参阅double (C# Reference)

答案 2 :(得分:3)

你应该看看this article有关浮点算术和.NET的内容。舍入发生的原因是数字如何转换为双精度浮点值以及打印时如何格式化,因为.NET默认为15位小数,而原始数字包含15位以后的小数。 / p>

您可以尝试test2.ToString("0.000000000000000000000000")查看是否可以从该号码中删除更多信息,但我对此表示怀疑。

答案 3 :(得分:1)

我能想到两个原因:

  1. 由于十进制和双精度的不同表示。有关浮点表示的详细信息,请参阅this文章。有可能在double中没有足够的位用于整数表示。
  2. 由于打印数字的方式。在您的打印选项中,指定小数点后可能少于18个数字 - 在这种情况下,您将获得舍入结果。
  3. 我会首先检查是否调整了打印选项,以确保问题不存在。

    ..但是知道第一个问题的唯一解决方案是停止使用double: - )