.NET中的十进制不准确

10r*_*r01 58 .net c# decimal floating-accuracy

昨天在调试期间发生了一些奇怪的事情,我无法解释它:

十进制计算

带括号的十进制计算

所以也许我没有在这里看到明显的或者我误解了.NET中的小数,但结果是否应该相同?

Lua*_*aan 69

decimal对我来说,所有数学都不是神奇的.它仍然是一个浮点数 - 主要区别float在于它是一个十进制浮点数,而不是二进制数.因此,您可以轻松地表示0.3为十进制(它不可能作为有限二进制数),但您没有无限精度.

这使得它更接近人类进行相同的计算,但你仍然需要想象某人单独进行每项操作.它专门用于财务计算,你不会在数学中做那种事情 - 你只需要一步一步地按照非常具体的规则舍入每个结果.

事实上,对于许多情况,decimal可能比float(或更好double)更糟糕.这是因为decimal根本不进行任何自动舍入.做同样的double事情会给你22个预期,因为它会自动地假设差异无关紧要 - 在decimal,它确实 - 这是重要的一点decimal.Math.Round当然,您可以通过插入手册来模拟这一点,但这没有多大意义.


phu*_*clv 30

Decimal只能在精度限制内精确存储十进制精确值.这里22/24 = 0.91666666666666666666666 ...需要无限精度或合理类型来存储,并且在舍入后它不等于22/24.

如果先进行乘法,那么所有的值都是完全可表示的,因此您看到了结果.


Say*_*yse 14

通过添加括号,您可以确保在乘法之前计算除法.这种微妙的看起来足以影响计算,足以引入浮动精度问题.

由于计算机实际上无法生成所有可能的数字,因此您应该确保将其计算在计算中

  • @Luaan:计算机也可以做那件很酷的事情.当你告诉他们用有限精度浮点数进行计算时,他们就会服从. (10认同)
  • 但是,人类可以做的很酷的事情就是在剩下的计算中将它保持为"1/3",或写成"0.33"(无限扩展).即使对于无理数,我们也可以写出它们是如何定义的,或者只是使用常数.当你真正认真对待精确度时非常方便:D (6认同)
  • 人类和计算机都知道浮点数-3中的"1/3"为"0.1". (5认同)
  • ‘1 / 3’ 恰好是 12 进制的 ‘0.4’。 (2认同)