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