为什么模数运算符在javascript中返回小数?
为什么JavaScript中的49.90 % 0.10
返回0.09999999999999581
? 我预计它是0。
由于JavaScript使用总是导致舍入错误的浮点数学运算。
如果您需要两位小数的精确结果,请在操作前将您的数字乘以100
,然后再进行分割:
var result = ( 4990 % 10 ) / 100;
如有必要,轮次
Javascript的编号使用“IEEE双精度”来存储值。 他们无法准确存储所有的十进制数字。 由于将十进制数转换为二进制时的舍入误差,结果不为零。
49.90 = 49.89999999999999857891452848...
0.10 = 0.10000000000000000555111512...
因此,楼层(49.90 / 0.10)仅为498,其余为0.09999 ....
看来你正在使用数字来存储美元数额。 不要这样做,因为浮点运算会传播并放大舍入误差。 将该数字存储为美分数量。 整数可以精确表示,并且4990 % 10
将返回0。
我将把它留在这里供将来参考,但这里有一个方便的函数,可以更精确地处理涉及浮点数的余数(因为JS没有模运算符)。
function floatSafeRemainder(val, step){
var valDecCount = (val.toString().split('.')[1] || '').length;
var stepDecCount = (step.toString().split('.')[1] || '').length;
var decCount = valDecCount > stepDecCount? valDecCount : stepDecCount;
var valInt = parseInt(val.toFixed(decCount).replace('.',''));
var stepInt = parseInt(step.toFixed(decCount).replace('.',''));
return (valInt % stepInt) / Math.pow(10, decCount);
}
$(function() {
function floatSafeModulus(val, step) {
var valDecCount = (val.toString().split('.')[1] || '').length;
var stepDecCount = (step.toString().split('.')[1] || '').length;
var decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;
var valInt = parseInt(val.toFixed(decCount).replace('.', ''));
var stepInt = parseInt(step.toFixed(decCount).replace('.', ''));
return (valInt % stepInt) / Math.pow(10, decCount);
}
$("#form").submit(function(e) {
e.preventDefault();
var safe = 'Invalid';
var normal = 'Invalid';
var var1 = parseFloat($('#var1').val());
var var2 = parseFloat($('#var2').val());
if (!isNaN(var1) && !isNaN(var2)) {
safe = floatSafeModulus(var1, var2);
normal = var1 % var2
}
$('#safeResult').text(safe);
$('#normalResult').text(normal);
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="form" novalidate>
<div>
<input type="number" id="var1">%
<input type="number" id="var2">
</div>
<div>safe: <span id="safeResult"></span><div>
<div>normal (%): <span id="normalResult"></span></div>
<input type="submit" value="try it out">
</form>
链接地址: http://www.djcxy.com/p/27463.html
上一篇: Why does modulus operator return fractional number in javascript?
下一篇: How many decimal places does the primitive float and double support?