Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Math.round vs.Math.ceil产生意外结果_Javascript - Fatal编程技术网

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

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 =

用户可以输入值或简单表达式作为除法。 输出值应为小数点后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 = 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