关于DOUBULE类型相乘的奇怪问题,很是告不明白
我今天作了个代码,是计算路费的,如果算出结果代小数点的我就用MATH.FLOOR()给小数点去掉 小数点以后的都不要了。但是我今天TEST的时候发现了个问题。
如:
double a = 3000;
double b = 0.29;
double c = a*b;
我用调试模式时发现.在即时窗口
我输入
?a*b
869.99999999999989
a*b
869.99999999999989
?c.ToString()
"870"
的出的结果却是这个样子 我不明白为什么 会出现这个情况,请告诉给我解答一下
正常情况我用计算器算3000*0.29=870;
但是这里面却是869.99999999999989; --------------------编程问答-------------------- 浮点数总会有一点微小的误差,LZ有兴趣可以学习一下IEEE754
试试Math.Floor( Math.Round(c, 2) ),不知道行不行,期待楼下的高手 --------------------编程问答-------------------- 有没有人告诉我啊 --------------------编程问答-------------------- 關注 --------------------编程问答-------------------- 告诉我啊 老大们 --------------------编程问答-------------------- 因为浮点数是没有0这个概念的,所有的数都是有精度的。
这也就是为什么你一乘会出现869.99999999999989的奇怪数字的原因,因为所有的数字都有一个精度问题,所以使用Double型的值一定要限定一个精度. --------------------编程问答-------------------- 是精度问题,电脑的计算方法跟你的不一样的。 --------------------编程问答-------------------- 因为很多浮点小数都是不精确的,
double b = 0.29;
从这个数储存到计算机中开始,它已经是一个近似数
你直接输出下b看看
计算机里面只有二进制
十进制小数到二进制小数有个转换过程
只有2的负幂的和,才是二进制有限小数
其他都是无限小数,必然会损失精度的~ --------------------编程问答-------------------- 谢谢老大们啊 感谢
补充:.NET技术 , C#