将数字附加到小数位

时间:2016-05-11 15:36:47

标签: algorithm numbers

如果我想在整数中添加一个数字(在某些语言中为int),我可以使用它(在伪代码中):

num = num * 10
num = num + digit

这可能导致:

  

适用于num = 123digit = 4

     

这将导致num = 1234

但如果num是十进制数,我怎样才能在小数位上添加数字?

  

适用于num = 0.123digit = 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))

但是有一个"清洁" (更简单)实现此目的的方法(如上面的数字函数添加数字)?

2 个答案:

答案 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的幂。