javascript - 性能 : toFixed() vs. Math.floor(x * 10000)

标签 javascript

我需要将两个浮点值比较到一定的精度(即小数点后 4 位):

var float1 = 0.0025132741228718345;
var float2 = 0.0025132812393818293;

我看到的两个选项:

Math.floor(float1 * 10000) === Math.floor(float2 * 10000); // 25 === 25

...或者:

float1.toFixed(4) === float2.toFixed(4) // "0.0025" === "0.0025"

因为操作每秒会发生 60 次,所以我问自己:

  1. 哪个选项的性能更高?
  2. 是更广泛接受的选项之一吗?
  3. 还有第三种选择吗?

最佳答案

function floor(f1, f2) {
    return Math.floor(f1 * 10000) === Math.floor(f2 * 10000);
}
function toFixed(f1, f2) {
    return f1.toFixed(4) === f2.toFixed(4);
}
function subtract(f1, f2) {
    return Math.abs(f1 - f2) < 0.00001;
}
function test(fn) {
     console.time(fn.name);
     for (let i = 0; i < 1000000; ++i) {
         fn(Math.random(), Math.random());
     }
     console.timeEnd(fn.name);
}
for (const fn of [floor, toFixed, subtract]) {
    test(fn);
}

引擎基准测试

v8(基于 Chromium 的浏览器)

  • 下限:204.911 毫秒
  • 固定:4145.529 毫秒
  • 减去:292.390 毫秒

SpiderMonkey(基于 Firefox 的浏览器)

  • 下限:566.81 毫秒
  • 固定:683.56ms
  • 减去:423.76ms

在您提供的两个选项之间,Math.floor 方法速度更快。

虽然 subtract 可能是一个明智的选择。

(如果你不相信我,你自己运行这个基准测试。)

关于javascript - 性能 : toFixed() vs. Math.floor(x * 10000),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36529495/

相关文章:

javascript - D3 : How to append a pre-loaded svg?

javascript - 从动态创建的按钮获取文本值jquery

javascript - colorbox(使用 live)在 ​​jQuery ajax 调用后没有重新绑定(bind)

javascript - 如何处理: When image is clicked identical image generated using Javascript

javascript - 客户端的 NodeJS 应用程序

javascript - 使用 DOM 方法处理 AJAX 响应

javascript - 从函数返回的对象的生命周期

javascript - 如何在 JavaScript 中舍入一个数字? .toFixed() 返回一个字符串?

javascript - 如何允许用户使用此 JQuery 示例关闭幻灯片?

javascript - Angular 表现怪异 $routeChangeSuccess