繁体   English   中英

Math.round vs.math.ceil产生意外结果

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM