我无法弄清楚为什么会这样:
var a:String = "0.07";
var b:Number = 0.08;
trace( Number(a) + Number(b) ); // 0.15000000000000002
,但使用十分之一时,结果还可以:
var a:String = "0.7";
var b:Number = 0.8;
trace( Number(a) + Number(b) ); // 1.5
答案 0 :(得分:1)
问题在于使用Number
float 类型(不是整数类型)。浮点算术不精确,通常四舍五入以给出看似正确的值。例如,0.08 + 0.08
给出正确的 0.16 ,0.07 + 0.07
给出正确的 0.14 ,那么为什么0.07 + 0.08
没有给出正确的 0.15 强>? 浮动舍入错误会为您提供 0.15000000000000002 结果。
请记住trace
显示字符串(可以包含所有数字),这样您就可以打印出完整的 0.15000000000000002 (包括错误),这会导致您的真实价值出现混淆是
最简单的解决方法:使用myNum.tofixed(2);
两位小数。
var a:String = "0.07";
var b:Number = 0.08;
trace( ( Number(a) + Number(b) ).toFixed(2) ); //gives 0.15
正确修复:使用整数(整数)&除以100
var a:String = "7";
var b:Number = 8;
trace( ( Number(a) + Number(b) ) /100 ); //gives 0.15
把它想象成美分&美元。由于浮动美元的三位数为1.75
,因此与整数美分中的175
相同。要从我们的整数分数中获取1.75
,我们会175 / 100 = 1.75
。除以100得到两位小数,除以小数点后三位等等,然后......左右将该断裂值加回Number
,只需执行以下操作:
var myNum : Number = ( Number(a) + Number(b) ) /100;
trace("myNum : " + myNum); //gives myNum : 0.15