修复包含数字溢出的数据

时间:2018-03-08 14:52:30

标签: excel

我已经获得了一个我已经识别的数据集包含带有数字溢出的记录,例如-214012688。我有办法解决这个问题吗?

这是我的数据样本

2142936357
2143000225
2142936544
2142974737
2142935734
2143051458
-2143303677
-2142887448
2142866111
2142864212
2143020049
2143009445
2143300604
2143121125
-2142802104
2142801451

数据集未排序,因此数字不是按顺序排列的。当我问我的客户为什么会出现负数时,因为它超过了最大整数金额。

1 个答案:

答案 0 :(得分:0)

如果任何值在翻转后变为正值,则无法对其进行修复,但是如果不是这种情况,则可以编写a custom function以获取每个负值之间的差的绝对值和签名的最小值,然后将其添加到签名的最大值。这是一个JavaScript函数:

function signedRolloverToUnsigned (x, signedMin, signedMax) {
  if (x < 0) {
    x = Math.abs((signedMin - 1) - x) + signedMax;
  }
  return x;
}

这是自定义Google表格功能,如果您只想复制+粘贴并在文档中使用它,则需要使用该功能:

/**
 * Converts signed rollover (negative) values to their equivalent unsigned positive values
 *
 * @param {number} value The value to convert.
 * @return The unsigned representation of the input value.
 * @customfunction
 */
function signedRolloverToUnsigned (value) {
  if (value < 0) {
    value = Math.abs((-2147483648 - 1) - value) + 2147483647;
  }
  return value;
}

以下是使用您提供的数据的有效示例:

'use strict';

function signedRolloverToUnsigned (x, signedMin, signedMax) {
  if (x < 0) {
    x = Math.abs((signedMin - 1) - x) + signedMax;
  }
  return x;
}

const text = `2142936357
2143000225
2142936544
2142974737
2142935734
2143051458
-2143303677
-2142887448
2142866111
2142864212
2143020049
2143009445
2143300604
2143121125
-2142802104
2142801451`;

const arrSource = text.split('\n').map((x) => {
  return parseInt(x);
});

const signedRange = [-2147483648, 2147483647];

const arrFixed = arrSource.map((x) => signedRolloverToUnsigned(x, signedRange[0], signedRange[1]));


//---Ignore: For displaying output --->

document.body.style = 'background-color: #eeeeee; padding: 1rem;';
const pre = document.body.appendChild(document.createElement('pre'));
const samp = pre.appendChild(document.createElement('samp'));
samp.textContent = arrFixed.join('\n');
const styles = {
  'box-sizing': 'border-box',
  'background-color': 'white',
  'border-radius': '0.5rem',
  'display': 'block',
  'padding': '1rem',
};

for (const [prop, value] of Object.entries(styles)) {
  samp.style.setProperty(prop, value);
}