我有以下虚拟测试脚本:

function test() {
  var x = 0.1 * 0.2;
  document.write(x);
}
test();

这将打印结果0.020000000000000004,而只打印0.02(如果使用计算器).据我所知,这是由于浮点乘法精度的错误.

有没有人有一个好的解决方案,在这种情况下,我得到了正确的结果0.02?我知道有像toFixed这样的函数,或者四舍五入是另一种可能性,但我真的希望在不进行任何切割和四舍五入的情况下打印整个数字.我只是想知道你们当中有没有人有好的,优雅的解决方案.

当然,否则我会舍入到10位左右.

推荐答案

Floating-Point Guide人中:

What can I do to avoid this problem?

这取决于什么样的

  • 如果你真的需要你的结果准确地加起来,特别是当你 使用货币:使用特殊小数 数据类型.
  • 如果你只是不想看到那些额外的小数位:简单地说
  • 如果没有十进制数据类型可用,另一种方法是工作

请注意,第一点仅适用于您确实需要特定行为的情况.大多数人不需要这个,他们只是对自己的程序不能正确处理1/10这样的数字感到恼火,而没有意识到如果发生1/3这样的错误,他们甚至不会 blink .

如果第一点真的适用于您,请使用BigDecimal for JavaScript,它一点也不优雅,但实际上解决了问题,而不是提供不完美的解决方法.

Javascript相关问答推荐

在shiny 模块中实现JavaScript

Mongodb拥有5亿个文档,我想根据JavaScript驱动程序中的两个字段使用regEx进行搜索,而不是模式

获取加载失败:获取[.]添加时try 将文档添加到Firerestore,Nuxt 3

如何使用侧边滚动按钮具体滚动每4个格?

使用下表中所示的值初始化一个二维数组

Angular中计算信号和getter的区别

Redux查询多个数据库Api reducerPath&

Msgraph用户邀请自定义邮箱模板

为什么123[';toString';].long返回1?

try 使用javascript隐藏下拉 Select

将内容大小设置为剩余可用空间,但如果需要,可在div上显示滚动条

覆盖加载器页面避免对页面上的元素进行操作

NG/Express API路由处理程序停止工作

使用NextJS+MongoDB+Prisma ORM获取无效请求正文,无法发布错误

在画布中调整边上反弹框的大小失败

在FAQ Accodion应用程序中使用React useState时出现问题

FireBase云函数-函数外部的ENV变量

处理app.param()中的多个参数

postman 预请求中的hmac/sha256内标识-从js示例转换

相对于具有选定类的不同SVG组放置自定义工具提示