我有以下测试代码:
decimal test1 = 0.0500000000000000045656554454M;
double test2 = (double)test1;
这导致test2在调试时显示为0.05。为什么它被舍入到2位小数?
由于
答案 0 :(得分:8)
该转化的价值实际为0.050000000000000009714451465470119728706777095794677734375,如DoubleConverter所示。这是您转换后的最接近小数的精确值。
使用调试器或普通字符串格式时,通常不会显示确切的结果。
答案 1 :(得分:4)
原因是double可以包含不超过15-16个有效数字。
答案 2 :(得分:3)
你应该看看this article有关浮点算术和.NET的内容。舍入发生的原因是数字如何转换为双精度浮点值以及打印时如何格式化,因为.NET默认为15位小数,而原始数字包含15位以后的小数。 / p>
您可以尝试test2.ToString("0.000000000000000000000000")
查看是否可以从该号码中删除更多信息,但我对此表示怀疑。
答案 3 :(得分:1)
我能想到两个原因:
我会首先检查是否调整了打印选项,以确保问题不存在。
..但是知道第一个问题的唯一解决方案是停止使用double: - )