用javascript切掉未使用的小数

用javascript切掉未使用的小数,javascript,decimal,Javascript,Decimal,我有一个货币输入,只需要返回有效数字。输入总是有两位小数,因此: 4.00 -> 4 4.10 -> 4.1 4.01 -> 4.01 以下是我目前的做法: // chop off unnecessary decimals if (val.charAt(val.length-1) == '0') { // xx.00 val = val.substr(0, val.length-1); } if (val.charAt(val.length-1) == '

我有一个货币输入,只需要返回有效数字。输入总是有两位小数,因此:

4.00  ->  4
4.10  ->  4.1
4.01  ->  4.01
以下是我目前的做法:

// chop off unnecessary decimals
if (val.charAt(val.length-1) == '0') { // xx.00
    val = val.substr(0, val.length-1);
}
if (val.charAt(val.length-1) == '0') { // xx.0
    val = val.substr(0, val.length-1);
}
if (val.charAt(val.length-1) == '.') { // xx.
    val = val.substr(0, val.length-1);
}
这很管用,而且有一点直接,我有点喜欢,但也许有一种更漂亮的方式

我想我可以使用一个循环并运行三次,但实际上,当我条件化if语句时,它看起来至少会同样庞大。除此之外,还有什么想法吗?我想也有一种正则表达式的方法可以做到这一点……

我相信它可以做到这一点

parseFloat(4.00) // 4
parseFloat(4.10) // 4.1
parseFloat(4.01) // 4.01

parseFloat可以工作,但您必须将其转换回字符串。

您的代码还可以在数字中删除零,如“1000”。一个更好的变体是只对小数点后的零进行切分。正则表达式的基本替换如下所示:

str.replace(/(\.[0-9]*?)0+$/, "$1"); // remove trailing zeros
str.replace(/\.$/, "");              // remove trailing dot

所以你从一个字符串开始,你想要一个字符串结果,对吗

val = "" + parseFloat(val);
这应该行得通。更简洁

val = "" + +val;

也可以,但这种形式太难理解了


这些是如何工作的?它们将字符串转换为数字,然后再转换回字符串。您可能不想使用这些,但了解JavaScript转换的工作原理将有助于调试您所提出的任何问题。

我现在正试图找到类似的解决方案。我就是这样来到这里的

string to string: parseFloat(value).toFixed(2);
string to number: +(parseFloat(value).toFixed(2))
number to number: Math.round(value*100)/100;
number to string: (Math.round(value*100)/100).toFixed(2);
我在应用程序中使用了Number()函数,但看起来它的工作原理与parseFloat()相同

在检查号码之前,我先删除和逗号

 var valueAsNumber = Number( val.replace(/\,/g,'') );

我想这就是你想要的

    v = 33.404034
    v.toFixed(2) # v -> 33.40
    parseFloat(v.toFixed(2)) # 33.4
你有

    v = 33.00704034
    v.toFixed(2) # v -> 33.01
    parseFloat(v.toFixed(2)) # 33.01

    v = 33.00304034
    v.toFixed(2) # v -> 33.00
    parseFloat(v.toFixed(2)) # 33

浮点可能没有足够的精度来准确表示给定的十进制值;你永远不应该用它们来表示货币。这是真的。我认为只要你不对它们进行操作,它们就会被正确地表示。在JavaScript中,无论如何都不能用十进制进行操作(没有一个在内部使用字符串或整数数组的十进制库)。最好使用0+而不是0*,这样如果没有尾随的零,正则表达式就不匹配。你是对的,0*与匹配的零0没有任何用处。但至少它也不会造成任何伤害。对于未来的研究人员来说:之前的评论不再相关
    v = 33.404034
    v.toFixed(2) # v -> 33.40
    parseFloat(v.toFixed(2)) # 33.4
    v = 33.00704034
    v.toFixed(2) # v -> 33.01
    parseFloat(v.toFixed(2)) # 33.01

    v = 33.00304034
    v.toFixed(2) # v -> 33.00
    parseFloat(v.toFixed(2)) # 33