如何在 JavaScript 中解析保留两位小数的浮点数?

520
我有以下代码。如果price_result等于整数10,我想要添加两个小数位,例如10会变成10.00。或者如果它等于10.6则会变成10.60。不确定该如何实现。
price_result = parseFloat(test_var.split('$')[1].slice(0,-1));
17个回答

1125

你可以使用toFixed()来实现这个功能

var twoPlacedFloat = parseFloat(yourString).toFixed(2)

3
toFixed存在很多缺陷。此外,这是一个比w3schools更好的链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed - gotofritz
158
但是 toFixed() 返回的是字符串类型的数字,如果你要进行数值比较,需要再次使用 parseFloat 转换成数值类型。 - Pedro Muniz
28
使用 var twoPlacedFloat = +parseFloat(yourString).toFixed(2) 将字符串转换为浮点数。 - Jose Rui Santos
16
在你的字符串周围添加圆括号,以获取数字而不是字符串:parseFloat((yourString).toFixed(2)); - pvanallen
3
JavaScript默认情况下不具备浮点数据类型。请查看此链接https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures 它只有数字数据类型。因此,任何尝试将数字转换为浮点数值实际上都会将数字转换为字符串/数字表示形式。因此,在JavaScript中,实际的浮点值2.00始终是字符串/数字。 - Saurin Dashadia
显示剩余4条评论

89

9
使用上述公式,输入'2.00'将返回2。但我希望它返回2.00。 - Saurin Dashadia
8
不能两全其美。如果您想要输出一个数字而不是字符串,那么您将无法得到尾随零。因此,您可以将上述内容转换为字符串:var twoPlacedFloat = (Math.round(2.002745 * 100) / 100).toFixed(2); - pvanallen
9
如果我把100换成200,速度会增加吗? - alashow
如果浮点运算的数量保持不变,那么速度也将保持不变,因此没有。 - Rob Boerman
为什么不能简单地使用“数字*1”?我有什么遗漏的吗? - ncubica
1
@ncubica 这是关于小数位的问题。如果你取100,那么小数点后面有2位数字,如果你取10,那么小数点后面有1位数字,以此类推。 - alpakyol

59

当您使用toFixed时,它始终会将值作为字符串返回。这有时会使代码变得复杂。为了避免这种情况,您可以为Number创建一种替代方法。

当你使用 toFixed 时,它总是以字符串形式返回值。这有时会使代码变得复杂。为避免这种情况,您可以为 Number 创建一个替代方法。

Number.prototype.round = function(p) {
  p = p || 10;
  return parseFloat( this.toFixed(p) );
};

并使用:

var n = 22 / 7; // 3.142857142857143
n.round(3); // 3.143

或者简单地说:

(22/7).round(3); // 3.143

我写了一个购物车程序,尝试使用toFixed()和round()方法链接到parseFloat()方法。但是这些方法都无法与parseFloat()一起使用。 - Chris22
这让我省去了一些将要出现的麻烦。因此加1分。我不知道它会将数字转换为字符串。 - Lukas
@Lukas 不是,如果执行 parseFloat。 - Vlada
1
如果我将其应用于“2.00”数字,则返回2。 - Saurin Dashadia
这个方法是用于校正,而不是格式化。例如:0.1 + 0.2 // 0.30000000000000004,所以我需要对其进行校正 (0.1+0.2).round() // 0.3 - Vlada

21

为了返回一个数字,请再加一层括号。这样会更简洁。

var twoPlacedFloat = parseFloat((10.02745).toFixed(2));

5
你的公式里面有什么地方不对吗?var twoPlacedFloat = parseFloat(('2.00').toFixed(2)) 会产生错误。 - Saurin Dashadia
抱歉,之前使用了字符串变量而不是数字,toFixed()需要的是数字 - 现在已经修复了。但是Rob的答案使用Math.round在性能方面值得考虑。 - pvanallen
这应该是对Vlada答案的评论。 - Rodrigo García

9

如果您的目标是解析,而输入可能是一个字面量,则您期望得到一个 floattoFixed 无法提供这个功能,因此这里有两个简单的函数来提供这个功能:

function parseFloat2Decimals(value) {
    return parseFloat(parseFloat(value).toFixed(2));
}

function parseFloat2Decimals(value,decimalPlaces) {
    return parseFloat(parseFloat(value).toFixed(decimalPlaces));
}

4
预期效果与实际不符。parseFloat(parseFloat('10.5').toFixed(2)) 返回 10.5,预期结果是 10.50。同样地,parseFloat(parseFloat('10.50').toFixed(2)) 也返回 10.5 - MTK
它是一个浮点数,所以10.5等于10.50。 - Savage
1
我知道10.5 == 10.50,但我需要向客户端打印10.50而不是10.5。 - MTK

7

从 lodash 中,ceil 可能是最好的选择。

_.ceil("315.9250488",2) 
_.ceil(315.9250488,2) 
_.ceil(undefined,2)
_.ceil(null,2)
_.ceil("",2)

这也适用于数字,并且是安全的。


1
如果使用lodash,那么这是一个可行的解决方案。我目前正在使用underscore.js,版本为1.9.1,它没有类似的函数。 - Rodrigo García

7

您可以使用 .toFixed() 方法将浮点数值保留2位小数。

示例

let newValue = parseFloat(9.990000).toFixed(2)

//output
9.99

我该如何做到相反的效果?我有9.99,想要得到9.990000。 - Sofiya rao
1
@Sofiyarao parseFloat('9.99').toFixed(6),你将得到 9.990000。toFixed 确定小数点后有多少位数字。 - Paul G

5
parseFloat(parseFloat(amount).toFixed(2))

您需要两次解析它。第一次是将字符串转换为浮点数,然后将其修复为两位小数(但toFixed返回一个字符串),最后再次解析它。


2

我已经尝试过这个方法,它可以很好地工作。

var multiplied_value = parseFloat(given_quantity*given_price).toFixed(3);

示例输出:

9.007

示例输出:

这会返回一个字符串,请小心 - undefined

1

如果您不想四舍五入,请使用以下函数。

function ConvertToDecimal(num) {
    num = num.toString(); //If it's not already a String
    num = num.slice(0, (num.indexOf(".")) + 3); //With 3 exposing the hundredths place
   alert('M : ' +  Number(num)); //If you need it back as a Number    
}

使用以下代码处理整数值 function ParseFloat(str, val = 2) { str = str.toString(); if (str.indexOf(".") > 0) { str = str.slice(0, (str.indexOf(".")) + val + 1); } //如果上面的方法不起作用,可以尝试以下替代方案 //str = str.match(/^-?\d+(?:.\d{0,2})?/)[0]; return !isNaN(str) ? Number(str) : 0; } - Aditya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接