【发布时间】:2011-05-14 10:49:21
【问题描述】:
嘿,我有一些像这样的花车
4.3455
2.768
3.67
我想像这样显示它们
4.34
2.76
3.67
我不想将数字向上或向下舍入,只是将小数点后显示的数字数量限制为 2。
【问题讨论】:
标签: javascript floating-point decimal limit
嘿,我有一些像这样的花车
4.3455
2.768
3.67
我想像这样显示它们
4.34
2.76
3.67
我不想将数字向上或向下舍入,只是将小数点后显示的数字数量限制为 2。
【问题讨论】:
标签: javascript floating-point decimal limit
你正在寻找toFixed:
var x = 4.3455;
alert(x.toFixed(2)); // alerts 4.35 -- not what you wanted!
...但看起来你想要截断而不是四舍五入,所以:
var x = 4.3455;
x = Math.floor(x * 100) / 100;
alert(x.toFixed(2)); // alerts 4.34
【讨论】:
parseInt 会将数字转换为字符串,然后将该字符串转换回数字,而不考虑小数点后的任何内容。 :-) 但在这种情况下不需要它,您可以在数字上调用函数(它们会自动从原语转换为 Number 实例)。
正如 T.J 回答的那样,toFixed 方法将在必要时进行适当的舍入。它还会添加尾随零,这并不总是理想的。
(4.55555).toFixed(2);
//-> "4.56"
(4).toFixed(2);
//-> "4.00"
如果您将返回值转换为数字,则那些尾随零将被删除。这是一种比您自己进行舍入或截断数学更简单的方法。
+parseFloat((4.55555).toFixed(2));
//-> 4.56
+parseFloat((4).toFixed(2));
//-> 4
【讨论】:
如果您不想四舍五入到小数点后 2 位,请使用 toFixed() 舍入到 n 个小数位,然后将除 2 位之外的所有这些都去掉:
var num = 4.3455.toFixed(20);
alert(num.slice(0, -18));
//-> 4.34
请注意,当传递给toFixed() 的小数位数小于传入的实际数字的小数位数并且这些小数位是大数字时,这确实有舍入的轻微缺点。例如(4.99999999999).toFixed(10) 会给你5.0000000000。但是,如果您可以确保小数位数低于传递给toFixed() 的位数,这不是问题。但是,它确实使@TJ 的解决方案更加强大。
【讨论】:
警告! 当前接受的解决方案在某些情况下会失败,例如使用 4.27 它错误地返回 4.26。
这是一个始终有效的general solution。
(也许我应该将此作为评论,但在撰写本文时,我没有所需的声誉)
【讨论】:
大家好消息!一段时间以来,有一个替代方案:toLocaleString()
虽然它不完全用于舍入,但有一些有用的选项参数。
最小整数位数
要使用的最小整数位数。可能的值是从 1 > 到 21;默认值为 1。
最小分数位数
要使用的最小小数位数。
可能的值是从 0 > 到 20;纯数字和百分比格式的默认值为 0; t
货币格式的默认值是次要单位的数量 ISO 4217 货币代码列表提供的数字(如果列表为 2 不提供该信息)。
最大分数位数
要使用的最大小数位数。
可能的值是从 0 > 到 20;纯数字格式的默认值是 minimumFractionDigits 和 3 中的较大者
货币格式的默认值是 minimumFractionDigits 和次要单位数中的较大者 ISO 4217 货币代码列表提供的数字(如果列表为 2 不提供该信息);百分比格式的默认值 是 minimumFractionDigits 和 0 中的较大者。
minimumSignificantDigits
要使用的有效数字的最小数量。可能的值是从 1 到 21;默认值为 1。
maximumSignificantDigits
要使用的最大有效位数。可能的值是从 1 到 21;默认值为 21。
使用示例:
var bigNum = 8884858284485 * 4542825114616565
var smallNum = 88885 / 4545114616565
console.log(bigNum) // Output scientific
console.log(smallNum) // Output scientific
// String
console.log(
bigNum.toLocaleString('fullwide', {useGrouping:false})
)
// Return a string, rounded at 12 decimals
console.log(
smallNum.toLocaleString('fullwide', {maximumFractionDigits:12})
)
// Return a string, rounded at 8 decimals
console.log(
smallNum.toLocaleString('fullwide', {minimumFractionDigits:8, maximumFractionDigits:8})
)
// Return an Integer, rounded as need, js will convert it back to scientific!
console.log(
+smallNum.toLocaleString('fullwide', {maximumFractionDigits:12})
)
// Return same Integer, don't use parseInt for precision!
console.log(
parseInt(smallNum.toLocaleString('fullwide', {maximumFractionDigits:12}))
)
但是这与问题不符,是四舍五入:
function cutDecimals(number,decimals){
return number.toLocaleString('fullwide', {maximumFractionDigits:decimals})
}
console.log(
cutDecimals(4.3455,2),
cutDecimals(2.768,2),
cutDecimals(3.67,2)
)
【讨论】:
使用 toPrecision :)
var y = 67537653.76828732668326;
y = (String(y).indexOf('.') !== -1) ? +y.toPrecision(String(y).indexOf('.') + 2) : +y.toFixed(2);
// => 67537653.76
第二行的2表示小数位数,这种方式返回一个数字,如果要字符串去掉“+”运算符。
【讨论】: