Javascript Math.round vs.Math.ceil产生意外结果
用户可以输入值或简单表达式作为除法。 输出值应为小数点后2位的值。 e、 g 但是如果输入是一个除法,结果是一个分数,那么输出应该四舍五入。 e、 g 使用以下计算:Javascript Math.round vs.Math.ceil产生意外结果,javascript,Javascript,用户可以输入值或简单表达式作为除法。 输出值应为小数点后2位的值。 e、 g 但是如果输入是一个除法,结果是一个分数,那么输出应该四舍五入。 e、 g 使用以下计算: 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 =
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
但是:
但是我想要71.95
,因为500/6.95
产生71.942
。。。(因为我想在这种情况下总结一下)
我不知所措。这里的解决方案是什么?如果您想要取整,请使用
ceil()
而不是round()
:
如果您四舍五入7194.2
,您将得到7194
,而不是7195
,从而得到71.94
为什么
8.88*100
会变成8.89
,是因为计算机存储十进制数的方式。因为它们不能代表所有可能的小数,所以它们被近似到某个程度。因此8.88*100=888.0000000000001
,使用ceil
会导致889
,如果您想使用ceil()
,而不是round()
:
如果您四舍五入7194.2
,您将得到7194
,而不是7195
,从而得到71.94
为什么
8.88*100
会变成8.89
,是因为计算机存储十进制数的方式。因为它们不能代表所有可能的小数,所以它们被近似到某个程度。所以8.88*100=888.0000000000001
,使用ceil
会导致889
你不能用简单的方法来做
问题是计算机以基数2存储数字,并且精度有限。然后,您的8.88
变为
8.8800000000000078159700933611020445823669433593750
根据您的规则,它被四舍五入到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为基数操作这些字符串的库。您不能用简单的方法来完成 问题是计算机以基数2存储数字,并且精度有限。然后,您的
8.88
变为
8.8800000000000078159700933611020445823669433593750
根据您的规则,它被四舍五入到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为基数的字符串。基本区别… Math.floor()返回或舍入总是向下的,即Math.floor(3.8)将给出3的结果 Math.round总是返回或舍入到最接近的整数,即Math.round(3.8)产生尽可能接近的整数4
Math.ceil()总是向上返回或舍入,即Math.ceil(3.8)将4作为最接近的向上整数 基本区别… Math.floor()返回或舍入总是向下的,即Math.floor(3.8)将给出3的结果 Math.round总是返回或舍入到最接近的整数,即Math.round(3.8)产生尽可能接近的整数4
Math.ceil()总是向上返回或舍入,即Math.ceil(3.8)将4作为最接近的向上整数 为什么调用
fieldVal=eval(fieldVal)代码>?这里没用。@pierreemanuellallemant说的。而eval是邪恶的!另外,如果你想从71.942四舍五入到7.95,你不可能在任何数字系统中工作;)eval
非常有用,但是应该小心使用。我认为这个问题有点不清楚,必须读几遍才能理解实际的问题是什么。在我看来,你的问题是如何使用所有可能值的.ceil
或.round
生成通用函数代码>?这里没用。@pierreemanuellallemant说的。而eval是邪恶的!另外,如果你想从71.942四舍五入到7.95,你不可能在任何数字系统中工作;)eval
非常有用,但是应该小心使用。我认为这个问题有点不清楚,必须读几遍才能理解实际的问题是什么。在我看来,你的问题是如何使用.ceil
或.round
创建一个通用函数,该函数可以处理所有可能的值。这就是为什么银行工具以美分计算,而不是美元,并且在显示结果时只需添加点;)@非现金,除非你正在编写银行工具来分割金额。如果你的整数足够大,在求和后除以它应该没有问题,因为你不会给你的客户半美分。这就是为什么银行工具以美分而不是美元计算,并在显示结果时加上点;)@非现金,除非你正在编写银行工具来分割金额。如果你的整数足够大,在求和后除以它应该没有问题,因为你不会给你的客户半美分。这就是回合开始的原因我想你不明白这个问题。OP已尝试此操作,但当fieldVal==8.88
时,结果为sup
var fieldVal = 500/6.95;
fieldVal = Math.round(fieldVal * 100) / 100;
fieldVal; // yields 71.94
fieldVal = Math.ceil(fieldVal * 100) / 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