如何在Javascript中相乘?小数问题

gus*_*olo 24 javascript decimal multiplying

我在Javascript中有以下代码:

var m1 = 2232.00;
var percent = (10/100);
var total = percent*m1;
alert(total);
Run Code Online (Sandbox Code Playgroud)

问题是变量"total"给了我"223.20000000000002",它应该是"223.2",我该怎么做才能得到正确的值?

Mal*_*lil 20

.toFixed()是最好的解决方案.点后只保留两位数.

实验1:

var value = 3.666;
value.toFixed(2); //Output : 3.67
Run Code Online (Sandbox Code Playgroud)

实验2:

var value = 3.0000;
value.toFixed(2); //Output : 3.00
Run Code Online (Sandbox Code Playgroud)

  • 注意,`.toFixed(n)` 导致 **string** 不是十进制值......所以使用 `+` 或 `+=` 将连接,而不是添加到变量 (3认同)

Nie*_*sol 7

你无法得到确切的价值.这是浮点数的基本问题.

您可以强制使用固定数量的十进制数toFixed:

alert(total.toFixed(2));
Run Code Online (Sandbox Code Playgroud)

但是,请记住,这将留下您可能不想要的尾随零.您可以删除它们.replace(/0+$/,'');


Wil*_*ean 5

如果您尝试显示此数字,您可以使用toFixed(1)转换为字符串。如果您这样做,请跟踪类型,因为您无法将字符串与另一个数字相乘。

如果您打算在另一个计算中使用它,您可以将其截断到一位小数:

Math.round( total * 10 ) / 10
Run Code Online (Sandbox Code Playgroud)

然而,正如许多人所指出的,不精确的值就是浮点数的方式。

请参阅评论中链接的问题以获取更多好的信息。


gus*_*olo 5

感谢Dimitry,我使用以下页面找到了答案:

JavaScript 浮点备忘单

我决定使用以下类,因为我需要操作的确切值,并且它们与货币操作相关:


DrW*_*aky 5

运算符“*”和“/”并不总是完美工作,例如:

\n\n
32.09 * 100 = 3209.0000000000005\n100 / (1 / 32.09) = 3209.0000000000005\n
Run Code Online (Sandbox Code Playgroud)\n\n

解决方案:

\n\n

一种解决方案(最简单的解决方案)是使用 .toFixed(2) ,其中“2”是您想要的小数位数。但你必须考虑到这会返回一个字符串,并且它会四舍五入该值。

\n\n
45.6789.toFixed(2) \xe2\x80\x94> "45.68" as String\n
Run Code Online (Sandbox Code Playgroud)\n\n

其他最完整的选项是使用 .toLocaleString 将数字正确转换为您想要的国家/地区代码。您可以设置一对参数来将小数值始终固定为 2。这还会返回一个字符串:

\n\n
(654.3453).toLocaleString(\n  \'en-US\',\n  {minimumFractionDigits: 2, maximumFractionDigits: 2},\n) \xe2\x80\x94> "654.35" as String\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您需要它作为数字,您可以将其包装到 Number( ... ) 中:

\n\n
Number((654.3453).toLocaleString(\n  \'en-US\',\n  {minimumFractionDigits: 2, maximumFractionDigits: 2},\n)) \xe2\x80\x94> 654.35 as Number\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您只想要一个无小数的数字,请使用其中一种方法来确保结果不带小数。

\n\n
Math.trunc(32.09); \xe2\x80\x94> 32 as Number  \n(32.09).toFixed(0); \xe2\x80\x94> \xe2\x80\x9c32\xe2\x80\x9d as String\n32.09 | 0; \xe2\x80\x94> 32 as Number\n
Run Code Online (Sandbox Code Playgroud)\n