1

当我使用 reduce 方法编写以下代码时,值不精确:

return bytes.reduce((accumulator, currentValue, index) => {
                 return accumulator + (currentValue * Math.pow(256,(bytes.length - 2) - index));
    }
)

例如。输出数字5.99609375, 10.99609375, 7.99609375, 14.99609375 但是当我编写以下代码时,结果是精确的:

let result = 0.0;
for (let i = 0; i < bytes.length - 1; ++i) {
                result = result + (bytes[i] * Math.pow(256, (bytes.length - 2) - i));
    }
return result

例如。输出数字5, 10, 7, 14 输入字节数组是:

Uint8Array(4) [0, 0, 5, 255]
Uint8Array(4) [0, 0, 10, 255]
Uint8Array(4) [0, 0, 7, 255]
Uint8Array(4) [0, 0, 14, 255]

这是为什么?有没有办法使 reduce 方法精确工作?

const res = document.getElementById('result');
const res2 = document.getElementById('result2');
const arr = a = [
  [0, 0, 5, 255],
  [0, 0, 10, 255],
  [0, 0, 7, 255],
  [0, 0, 14, 255]
];
const fn = (bytes) => {
  let result = 0.0;
  for (let i = 0; i < bytes.length - 1; ++i) {
    result = result + (bytes[i] * Math.pow(256, (bytes.length - 2) - i));
  }
  return result
}
fn2 = (bytes) => {
  return bytes.reduce((accumulator, currentValue, index) => {
    return accumulator + (currentValue * Math.pow(256, (bytes.length - 2) - index));
  })
}
res.innerText += `${arr.map(fn)}`;
res2.innerText += `${arr.map(fn2)}`;
<div id="result"></div>
<div id="result2"></div>

4

2 回答 2

1

for 条件错误 应该是

 for (let i = 0; i < bytes.length ; ++i) {
于 2018-05-03T13:21:59.380 回答
1

为什么reduce受浮点问题影响而for循环不受?当我用 reduce 方法编写以下代码时,值不精确

这不是浮点问题的情况。如果您查看结果,您将看到如下内容:

5.99609375

当你有浮点精度是这样的

0.020000000000000004

问题出在 for 循环中,因为您只迭代字节数组中的第一n-1项。

for (let i = 0; i < bytes.length - 1; ++i) {

只需迭代所有数组项。

for (let i = 0; i < bytes.length; ++i) {

您会看到两个values,因为reduce方法遍历所有数组项,而 for 循环遍历第一个n-1项。

不幸的是,当然,没有办法让reduce的内置版本过早退出。

但是你可以使用slice方法。

return bytes.slice(0, -1).reduce((accumulator, currentValue, index) => {
    return accumulator + (currentValue * Math.pow(256,(bytes.length - 2) - index));
})
于 2018-05-03T13:29:19.520 回答