我已经获得了一个我已经识别的数据集包含带有数字溢出的记录,例如-214012688。我有办法解决这个问题吗?
这是我的数据样本
2142936357
2143000225
2142936544
2142974737
2142935734
2143051458
-2143303677
-2142887448
2142866111
2142864212
2143020049
2143009445
2143300604
2143121125
-2142802104
2142801451
数据集未排序,因此数字不是按顺序排列的。当我问我的客户为什么会出现负数时,因为它超过了最大整数金额。
答案 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);
}