.NET中的double multiplication损坏了吗?
这个问题在这里已经有了答案:
因为你误解了浮点运算以及数据的存储方式。
事实上,在这种特殊情况下,你的代码实际上并没有在执行时执行任何算术 - 编译器会完成它,然后在生成的可执行文件中保存一个常量。 但是,它无法存储精确的6.9值,因为该值无法用浮点格式精确表示,就像1/3无法精确地存储在有限的十进制表示中一样。
看看这篇文章是否对你有帮助。
为什么框架没有解决这个问题,并将这个问题从我这里隐藏起来,给我正确的答案,0.69 !!!
停止像dilbert经理一样行事,并且接受那些虽然很酷且很棒的电脑有限制。 在你的具体情况下,它不会“隐藏”问题,因为你已经明确告诉它不要。 语言(计算机)提供了格式的替代选择,您没有选择。 你选择了double,与decimal相比有一定的优势,并且有一些缺点。 现在,知道答案后,你感到不安的是,这些缺点不会奇迹般地消失。
作为一名程序员,您有责任从管理者身上隐藏这个缺点,并且有很多方法可以做到这一点。 但是,C#的制定者有责任使浮点正确工作,并且正确的浮点偶尔会导致数学错误。
因此,将每个其他数字存储方法,因为我们没有无限位。 我们作为程序员的工作是使用有限的资源来发生很酷的事情。 他们为你提供了90%的途径,让火炬回家。
而0.69可以很容易地用二进制表示,一个二进制数字用69表示,另一个表示小数位的位置。
我认为这是一个常见的错误 - 你在考虑浮点数就好像它们是基数为10(即小数 - 因此我强调)。
所以 - 你认为这个double有两个整数部分: 69 除以100得到小数点位置 - 这也可以表示为:
69 x 10到-2的幂 。
然而,浮点数将“点的位置”存储为2的基数。
你的float实际上被存储为:
68999999999999995 x 2给一些大负数的力量
一旦你习惯了这个问题,这不算什么问题 - 大多数人都知道并且期望1/3不能准确表达为小数或百分比。 只是不能用base-2表示的分数是不同的。
链接地址: http://www.djcxy.com/p/27437.html上一篇: Is double Multiplication Broken in .NET?
下一篇: What is the most effective way for float and double comparison?