您可以将javascript中的数字四舍五入到小数点后的1个字符(正确舍入)吗?
我尝试了* 10,舍入,/ 10,但是它在int末尾保留了两位小数。
您可以将javascript中的数字四舍五入到小数点后的1个字符(正确舍入)吗?
我尝试了* 10,舍入,/ 10,但是它在int末尾保留了两位小数。
Answers:
Math.round(num * 10) / 10
可行,这是一个例子...
var number = 12.3456789
var rounded = Math.round(number * 10) / 10
// rounded is 12.3
如果您希望它有一个小数位,即使那是0,也可以添加...
var fixed = rounded.toFixed(1)
// fixed is always to 1 d.p.
// NOTE: .toFixed() returns a string!
// To convert back to number format
parseFloat(number.toFixed(2))
// 12.34
// but that will not retain any trailing zeros
// So, just make sure it is the last step before output,
// and use a number format during calculations!
使用这个原理作为参考,这里有一个方便的小舍入函数,它需要精确...
function round(value, precision) {
var multiplier = Math.pow(10, precision || 0);
return Math.round(value * multiplier) / multiplier;
}
...用法...
round(12345.6789, 2) // 12345.68
round(12345.6789, 1) // 12345.7
...默认舍入到最接近的整数(精度0)...
round(12345.6789) // 12346
...并可以四舍五入到最接近的10或100等...
round(12345.6789, -1) // 12350
round(12345.6789, -2) // 12300
...以及正确处理负数...
round(-123.45, 1) // -123.4
round(123.45, 1) // 123.5
...并且可以与toFixed组合以一致地格式化为字符串...
round(456.7, 2).toFixed(2) // "456.70"
.toFixed()
因为当您需要输入数字时,它会返回字符串。
parseFloat
可以删除.toFixed()
整数(零)后的小数。通常,如果要进行数学运算,最好遵循第一个示例。如果要在用户界面中显示数字,请使用.toFixed()
。
var number = 123.456;
console.log(number.toFixed(1)); // should round to 123.5
toFixed()
出现故障-我在调用的Chrome浏览器中看到了此问题toFixed()
,然后将其转换为字符串,并显示类似的内容10.00000000068
-很奇怪。但是无法可靠地重现此内容。
.toFixed()
因为它String
可能在您需要时返回aNumber
如果使用,Math.round(5.01)
您将得到5
而不是5.0
。
如果您想两全其美,请将两者结合起来:
(Math.round(5.01 * 10) / 10).toFixed(1)
您可能要为此创建一个函数:
function roundedToFixed(_float, _digits){
var rounded = Math.pow(10, _digits);
return (Math.round(_float * rounded) / rounded).toFixed(_digits);
}
试试这个:
var original=28.453
// 1.- round "original" to two decimals
var result = Math.round (original * 100) / 100 //returns 28.45
// 2.- round "original" to 1 decimal
var result = Math.round (original * 10) / 10 //returns 28.5
// 3.- round 8.111111 to 3 decimals
var result = Math.round (8.111111 * 1000) / 1000 //returns 8.111
不太复杂且易于实现...
这样,您可以创建一个函数来执行以下操作:
function RoundAndFix (n, d) {
var m = Math.pow (10, d);
return Math.round (n * m) / m;
}
编辑:请参阅此如何使用圆形半舍入。我们大多数人在小学时教过的舍入模式
如果您的方法不起作用,请发布您的代码。
但是,您可以按以下方式完成舍入任务:
var value = Math.round(234.567*100)/100
会给你234.56
相似地
var value = Math.round(234.567*10)/10
会给234.5
这样,您可以使用变量代替上面使用的常量。
如果有人需要的话,可以使用小角度过滤器:
angular.module('filters').filter('decimalPlace', function() {
return function(num, precision) {
var multiplier = Math.pow(10, precision || 0);
return Math.round(num * multiplier) / multiplier;
};
});
如果通过以下方式使用:
{{model.value| decimalPlace}}
{{model.value| decimalPlace:1}}
{{model.value| decimalPlace:2}}
:)
通常,舍入是通过缩放来完成的: round(num / p) * p
使用指数表示法可以正确处理+ ve数的舍入。但是,此方法无法正确舍入情况。
function round(num, precision = 2) {
var scaled = Math.round(num + "e" + precision);
return Number(scaled + "e" + -precision);
}
// testing some edge cases
console.log( round(1.005, 2) ); // 1.01 correct
console.log( round(2.175, 2) ); // 2.18 correct
console.log( round(5.015, 2) ); // 5.02 correct
console.log( round(-1.005, 2) ); // -1 wrong
console.log( round(-2.175, 2) ); // -2.17 wrong
console.log( round(-5.015, 2) ); // -5.01 wrong
这也是我写的用于进行算术舍入的一个函数,您可以自己对其进行测试。
/**
* MidpointRounding away from zero ('arithmetic' rounding)
* Uses a half-epsilon for correction. (This offsets IEEE-754
* half-to-even rounding that was applied at the edge cases).
*/
function RoundCorrect(num, precision = 2) {
// half epsilon to correct edge cases.
var c = 0.5 * Number.EPSILON * num;
// var p = Math.pow(10, precision); //slow
var p = 1; while (precision--> 0) p *= 10;
if (num < 0)
p *= -1;
return Math.round((num + c) * p) / p;
}
// testing some edge cases
console.log(RoundCorrect(1.005, 2)); // 1.01 correct
console.log(RoundCorrect(2.175, 2)); // 2.18 correct
console.log(RoundCorrect(5.015, 2)); // 5.02 correct
console.log(RoundCorrect(-1.005, 2)); // -1.01 correct
console.log(RoundCorrect(-2.175, 2)); // -2.18 correct
console.log(RoundCorrect(-5.015, 2)); // -5.02 correct
这似乎在我扔给它的任何东西上都能可靠地工作:
function round(val, multiplesOf) {
var s = 1 / multiplesOf;
var res = Math.ceil(val*s)/s;
res = res < val ? res + multiplesOf: res;
var afterZero = multiplesOf.toString().split(".")[1];
return parseFloat(res.toFixed(afterZero ? afterZero.length : 0));
}
它会四舍五入,因此您可能需要根据用例进行修改。这应该工作:
console.log(round(10.01, 1)); //outputs 11
console.log(round(10.01, 0.1)); //outputs 10.1
我制作了一个返回数字类型的代码,并且仅在需要时才放置小数(不填充0)。
例子:
roundWithMaxPrecision(11.234, 2); //11.23
roundWithMaxPrecision(11.234, 1); //11.2
roundWithMaxPrecision(11.234, 4); //11.23
roundWithMaxPrecision(11.234, -1); //10
roundWithMaxPrecision(4.2, 2); //4.2
roundWithMaxPrecision(4.88, 1); //4.9
编码:
function roundWithMaxPrecision (n, precision) {
return Math.round(n * Math.pow(10, precision)) / Math.pow(10, precision);
}
我找到了一种避免精度问题的方法:
function badRound (num, precision) {
const x = 10 ** precision;
return Math.round(num * x) / x
}
// badRound(1.005, 2) --> 1
function round (num, precision) {
const x = 10 ** (precision + 1);
const y = 10 ** precision;
return Math.round(Math.round(num * x) / 10) / y
}
// round(1.005, 2) --> 1.01
Math.round(n * 10) / 10
确实有效。你的代码是什么?