首页 新闻 搜索 专区 学院

为什么double型的0.29*100让后结果是28.999999999999996

0
[已解决问题] 解决于 2013-04-01 17:40

转化整型的时候会截断小数位变成28了,朋友开发一个java项目做折扣计算的时候出现这个问题了。结果发现.Net也是这样。不光是0.29 0.57的时候也会变成56.9999999X

Nature Q的主页 Nature Q | 菜鸟二级 | 园豆:342
提问于:2013-01-03 22:38
< >
分享
最佳答案
0

这个问题涉及到,浮点数在计算机的存储方式的问题。

计算机不识别十进制数,他只认识0,1

具体的我给你推荐篇博文吧 http://www.cnblogs.com/jillzhang/archive/2007/06/24/793901.html

奖励园豆:5
朝曦 | 小虾三级 |园豆:1073 | 2013-01-03 23:47

也就是说用只能Math.Round来忽略误差或者用decmial来提高精度了

Nature Q | 园豆:342 (菜鸟二级) | 2013-01-04 00:27

@Natural Q: 

如果对精度,没那么高的要求。就用Math.Round吧

朝曦 | 园豆:1073 (小虾三级) | 2013-01-04 10:35
其他回答(7)
0

decimal a = 0.29m

这样的计算方式就是精确的。

dobule和float 比如1.0 在计算机中可能表现为0.9999999999999999999或者是 1.000000000000001

这2种形式

chenping2008 | 园豆:9836 (大侠五级) | 2013-01-04 09:38
0

这里也有一个关于计算误差的解决方案.

http://www.cnblogs.com/fumj/archive/2012/12/01/2797588.html

``炯`` | 园豆:4 (初学一级) | 2013-01-04 10:53
0

在金额使用的话:用decimal 比较。。小数点后几位   你可以按位截取的

普通的应用:应用Double Double也是可以截取的

在 水 一 方 | 园豆:1097 (小虾三级) | 2013-01-04 10:58
0

如果计算金额的话,你用decimal比较准确,这个是浮点数,在计算机的存储方式的形式只识别0,1,或者用Math.Round来忽略误差值

妍珊 | 园豆:1169 (小虾三级) | 2013-01-04 11:13
0

精度不同,导致的。

Lee's Blog | 园豆:530 (小虾三级) | 2013-01-04 15:30
0

要想不损失,

用Java的BigInteger
angelshelter | 园豆:9678 (大侠五级) | 2013-01-04 20:21
0

double是32位,你输出的时候是int型,是16位的,当然会有精度丢失了。上面的都不知道在扯些什么蛋。

息搏 | 园豆:227 (菜鸟二级) | 2013-02-20 11:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册