Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在数字的小数点后追加数字_Algorithm_Numbers - Fatal编程技术网

Algorithm 在数字的小数点后追加数字

Algorithm 在数字的小数点后追加数字,algorithm,numbers,Algorithm,Numbers,如果我想在整数上加一个数字(int,在某些语言中),我可以使用它(在伪代码中): 这可能导致: 对于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

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

这可能导致:

对于
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))

但是否有一种“更干净”(更简单)的方法来实现这一点(如上面的数字相加功能)?

使用十进制数字的字符串串联。以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

我建议将十进制数存储为一对整数(整数表示,小数位数)。在大多数现代语言(C++、C#、Java等)中,可以将其建模为对象类型,也可以将其建模为结构(C、Pascal等),以保持其良好的打包

在0.123的示例中,整数表示为123,小数点为3。要添加4,请使用整数方法,即乘以10再添加4,然后增加小数位数

这种方法还避免了浮点精度问题,即浮点值可能不完全匹配,或者根本不可表示,从而导致错误的结果,甚至可能导致无限循环。转换为浮点数就像除以pow(10,小数点)一样简单,因此这种转换不可能出现无限循环,并且数字被精确存储,因此即使它不能表示为浮点数,您仍然可以选择实现比较和算术运算

另外,支持比本机CPU寄存器大小更大的整数类型的语言(如Java和C#中的BigInteger)将允许您以这种方式支持任意精度浮点数,并且在末尾添加数字同样容易。在不提供现有支持的语言中创建自定义大整数类型也相当容易,因为它只需要支持乘10、加0-9和除10的幂

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