[英]Math.round vs. math.ceil yields unexpected results
用户可以输入值或简单表达式作为除法。 输出应为2个小数位的值。 例如
8.50 should yield 8.50
4/2 should yield 2.00
但是,如果输入是导致小数的除法运算,则应将输出四舍五入。 例如
500/3 should yield 166.67
使用以下计算:
var fieldVal = 500/3;
fieldVal = Math.ceil(fieldVal * 100) / 100;
fieldVal; // yields 166.67 - good
但是如果fieldVal = 8.88
则计算结果为8.89
如果我使用:
var fieldVal = 8.88;
fieldVal = Math.round(fieldVal * 100) / 100;
fieldVal; // yields 8.88 - good
但:
var fieldVal = 500/6.95;
fieldVal = Math.round(fieldVal * 100) / 100;
fieldVal; // yields 71.94
但我要71.95
因为500/6.95
收益率是71.942
...(因为在这种情况下我要四舍五入)
我很茫然。 这里有什么解决方案?
您无法以简单的方式做到这一点。
问题在于计算机将数字存储在基数2中,并且精度有限。 然后,您的8.88
变成
8.88000000000000078159700933611020445823669433593750
根据您的规则,它四舍五入到8.89
。
一种解决方案是将数量乘以100(在源代码中,不使用JS),最后将它们除以100。
var fieldVal100 = 888; // 8.88 * 100
fieldVal100 = Math.ceil(fieldVal100);
var fieldVal = fieldVal100 / 100; // 8.88
var fieldVal100 = 50000/3; // 500/3 * 100
fieldVal100 = Math.ceil(fieldVal100);
var fieldVal = fieldVal100 / 100; // 166.67
var fieldVal100 = 50000/6.95; // 500/6.95 * 100
fieldVal100 = Math.ceil(fieldVal100);
var fieldVal = fieldVal100 / 100; // 71.95
另一种解决方案是将数字存储为字符串而不是数字,并使用一些库以10为基数处理这些字符串。
如果要向上取整,请使用ceil()
而不是round()
:
fieldVal = Math.ceil(fieldVal * 100) / 100;
如果你舍7194.2
你会得到7194
而不是7195
,从而导致71.94
。
8.88 * 100
会变成8.89
的原因是因为计算机存储小数的方式。 因为它们不能表示所有可能的小数,所以将它们近似为一个程度。 所以8.88 * 100 = 888.0000000000001
,使用ceil
会导致889
。
基本区别...
Math.floor()返回或四舍五入始终为整数 ,即Math.floor(3.8)的结果为3 。
Math.round总是返回或舍入到最接近的整数,即Math.round(3.8)产生4作为可能的最接近的整数。
Math.ceil()返回或四舍五入总是向上,即Math.ceil(3.8)产生4作为最接近的向上整数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.