如何防止 toFixed 四舍五入十进制数字
how to prevent toFixed from rounding off decimal numbers
我对html,javascript和css很陌生,所以如果我的问题对你来说听起来很愚蠢,请原谅。我的问题是如何防止函数toFixed()
四舍五入十进制数。
这是我的链接:http://jsfiddle.net/RWBaA/4/
每当用户在文本框中键入时,我正在检查输入是否为有效的十进制数。同时,我还想检查输入是否是有效的货币,这意味着它只能在小数点右侧再加两个数字。问题是当用户在小数点后输入第 3 个数字时,如果第 3 个数字为>= 5,则小数点后的第二个数字将四舍五入到最接近的百分之一。
测试输入 :
输入输出 123456.781 -> 123456.78123456.786 -> 123456.79
为什么我的代码不允许在 chrome 中使用箭头键?
请帮忙。如果您有更好的解决方案,您可以自由建议。提前谢谢。
这更简单:
function truncateToDecimals(num, dec = 2) {
const calcDec = Math.pow(10, dec);
return Math.trunc(num * calcDec) / calcDec;
}
所以:
truncateToDecimals(123456.786) -> 123456.78
先将数字(向下)舍入到最接近的美分:
val = Math.floor(100 * val) / 100;
编辑 有人指出,例如 1.13 失败。 我自己应该更清楚!
这失败了,因为 1.13 的内部浮点表示形式略小于 1.13 - 乘以 100 不会产生 113,而是 112.999999999999998578915,然后将其向下舍入会得到 1.12
重新阅读问题后,似乎您实际上只是在尝试执行输入验证(见下文),在这种情况下,您应该使用正常的表单验证技术,而根本不应该使用.toFixed()
。 该函数用于呈现数字,而不是用它们计算。
$('#txtAmount').on('keypress', function (e) {
var k = String.fromCharCode(e.charCode);
var v = this.value;
var dp = v.indexOf('.');
// reject illegal chars
if ((k < '0' || k > '9') && k !== '.') return false;
// reject any input that takes the length
// two or more beyond the decimal point
if (dp >= 0 && v.length > dp + 2) {
return false;
}
// don't accept >1 decimal point, or as first char
if (k === '.' && (dp >= 0 || v.length === 0)) {
return false;
}
});
试一试,它不会四舍五入你的小数
/**
* @param {any} input
* @param {number} decimals
*/
var toFixed = function(input, decimals) {
var arr = ("" + input).split(".");
if (arr.length === 1) return input;
var int = arr[0],
max = arr[1].length,
dec = arr[1].substr(0, decimals > max ? max : decimals);
return decimals === 0 ? int : [int, "." , dec].join("");
}
此外,为了防止 toFixed() 舍入十进制数字并将您的数字转换为小数点后两位,您可以使用它,
val = (Math.floor(100 * val) / 100).toFixed(2);
如果你想避免四舍五入...例如 1.669 => 1.67, 548.466 => 548.47
函数结果如下所示:1.669 => 1.66, 548.466 => 548.46
那么下面的JQuery函数将帮助你。它经过测试并正常工作。
<input name="a" type="text" id="a" size="7%" tabindex="2">
$('#a').keyup(function(e){
if($(this).val().indexOf('.')!=-1){
if($(this).val()=="." && $(this).val().length==1){
this.value = parseFloat(0).toFixed(1);
}else if($(this).val().split(".")[1].length > 2){
if( isNaN( parseFloat( this.value ) ) )
return;
this.value = $(this).val().split(".")[0]+"."+$(this).val().split(".")[1].substring(0,2);
}
}
});
这听起来可能很愚蠢,但为什么不防止在数学上四舍五入呢?
基本上,您正在做的是将值替换半个精度点,这样舍入就会变得地板化。
正常:0 到 4 组成 05 到 9 做 10
减去半个精度点后:-4 (变为 6) 到 -1 (变为 9) 设为 00 到 4 组成 0
您需要减去 0.5/10^N在这种情况下,对于 2 位小数,0.5/10^2 = 0.5/100 = 0.005对于 4 位小数,您需要减去 0.00005
但是,由于浮点在计算机和CPU中的工作方式,您需要确保有足够的精度来用于此目的。所以我强烈建议你把精度提高到CPU不会搞砸的程度。
num = 123456.786
Math.trunc(num) + (num-Math.trunc(num)-0.005).toFixed(2)
num = 123456.781
Math.trunc(num) + (num-Math.trunc(num)-0.005).toFixed(2)
num = 123456.789
Math.trunc(num) + (num-Math.trunc(num)-0.005).toFixed(2)
这已经过测试,适用于所有情况。
function truncateTwoDecimals(num, dec = 2) {
const totalDecimal = countDecimals(num);
if (totalDecimal === 1) {
dec = 1;
}
if (totalDecimal === 2) {
return num;
}
const calcDec = Math.pow(10, dec);
return Math.trunc(num * calcDec) / calcDec;
}
function countDecimals(value) {
if(Math.floor(value) === value) return 0;
return value.toString().split(".")[1].length || 0;
}
const res = truncateTwoDecimals(1.13);
console.log(res);
console.log(truncateTwoDecimals(4492903605.9));
- 我想在AngularJS应用程序中创建一个输入数字框,用户不应该在该框上键入十进制数字.(一个整数输入框)
- 将数字四舍五入到小数点后两位
- 将数字四舍五入到小数点后两位,以设置货币格式
- 将数字四舍五入到两位小数
- 在javascript中接受十进制数字的Regex
- 将数字四舍五入到最接近的10's放置javascript
- 将数字四舍五入到最近值
- 如何在TextBox中只允许使用十进制数字
- 如何删除“"使用jQuery从十进制数字中提取
- 只允许整数和十进制数字textbow jquery(不带正则表达式)
- 十进制数字的 Javascript 正则表达式 - 替换非数字和多个小数点
- 使用 toFixed 对十进制数字进行舍入
- 如何使用 JavaScript 删除十进制数字
- 将逗号javascript后的最后两个数字四舍五入
- 如何防止 toFixed 四舍五入十进制数字
- 如何在 Javascript 中始终将数字四舍五入到最接近的一分钱
- 我如何修改这个JavaScript正则表达式来检查字符串是否是一个最多必须有2个十进制数字的数字
- 将数字四舍五入到最接近的千,根据数字向上或向下
- JavaScript中的Regex,用于验证十进制数字
- 如何在d3 radialProgress中显示十进制数字