日期:2014-05-17  浏览次数:20728 次

关于double小数位数的问题

double d1 = 21335.38;

d1 -= 21335;
 
Response.Write(d1.ToString());

结果是:
0.380000000001019

而不是0.38,

这是什么原理?

------解决方案--------------------
这就好比用三进制数表示,1.1(三进制),是一个有穷小数,但是你就没有办法用十进制表示,只能表示成1.3333333...,那么再转换到三进制,就有误差了。

类似的,除非小数点后面的小数是1/2^n,比如0.5 0.25 0.125 0.0625,或者它们的组合(比如0.75,0.875 ...)否则像0.38是没有办法用二进制准确表示的。计算机内部的浮点数是二进制格式的。
------解决方案--------------------
亲 不知道你用过windows内置计算器没有?细心的话 你会发现各种蛋疼的事情都能出现。解释这个需要一些数据理论基础。比如什么 反码 补码 等等等等 一些列。大学的时候老师讲过为啥会这样,可惜忘记了