如果我想在整数中添加一个数字(在某些语言中为int
),我可以使用它(在伪代码中):
num = num * 10
num = num + digit
这可能导致:
适用于
num = 123
和digit = 4
这将导致
num = 1234
但如果num
是十进制数,我怎样才能在小数位上添加数字?
适用于
num = 0.123
和digit = 4
这将导致
num = 0.1234
到目前为止我有什么
copy = num
decimalplaces = 0
loop for infinity
{
decimalplaces = decimalplaces + 1
copy = copy * 10
if copy equals floor(copy)
break out of loop
}
d = d + (digit / pow(10, decimalplaces + 1))
但是有一个"清洁" (更简单)实现此目的的方法(如上面的数字函数添加数字)?
答案 0 :(得分:1)
使用十进制数的字符串连接。可以容易地附加基数10的字符串表示,然后将其解析回数字。此外,使用您的方法无法添加零。
function appendDecimalDigit(num, digits) {
return parseFloat(num.toString() + (num.toString().indexOf(".") >= 0 ? digits.toString() : "." + digits.toString()));
}
console.log(appendDecimalDigit(123, "4")); // 123.4
console.log(appendDecimalDigit(1234, "5")); // 1234.5
console.log(appendDecimalDigit(123.456, "000789")); // 123.456000789
console.log(appendDecimalDigit(1.01, "01")); // 1.0101
console.log(appendDecimalDigit(1234567890, "1")); // 1234567890.1
如果你想要一个纯粹的数字解决方案,那么你就会遇到类似于你已有的东西。 注意:根据您实现此功能的系统,您可能遇到浮点二进制算术问题(这不会发生在大数字十进制数学库中),这会导致数字不准确,因为更大或者更准确。
function appendDecimalDigit(num, digit) {
var places = 0;
while(num * Math.pow(10, places) !== Math.floor(num * Math.pow(10, places))) {
places++;
}
return num + digit * Math.pow(10, -(places + 1));
}
console.log(appendDecimalDigit(123, 4)); // 123.4
console.log(appendDecimalDigit(1234, 5)); // 1234.5
console.log(appendDecimalDigit(123.456, 9)); // 123.4569
console.log(appendDecimalDigit(1.01, 1)); // 1.011
console.log(appendDecimalDigit(1234567890, 1)); // 1234567890.1
答案 1 :(得分:1)
我建议将十进制数存储为一对整数,使用(integer_representation,decimal_places)。这可以在大多数现代语言(C ++,C#,Java等)中建模为对象类型,或者作为结构(C,Pascal等)建模,以保持良好的打包状态。
在0.123的示例中,您的整数表示将为123,并且您的decimal_places将为3.要添加4,您使用乘以10的整数方法并添加4,然后递增小数位。
这种方法还避免了浮点精度问题,其中浮点值可能不是完全匹配,或者可能根本不可表示,导致不正确的结果或甚至可能是无限循环。转换为浮点数就像除以pow(10,decimal_places)一样简单,因此这种转换不可能存在无限循环,并且数字被精确存储,即使它不能表示为浮点数,你仍然可以选择实现比较和算术运算。
作为一个额外的好处,支持比本机CPU寄存器大小更大的整数类型的语言,例如Java和C#中的BigInteger,将允许您以这种方式支持任意精度浮点数,具有所有相同的易用性将数字追加到最后。使用不提供现有支持的语言创建自定义大整数类型也相当容易,因为它只需要支持乘以10,加0-9,除以10的幂。