将 n 转换为 0.n 而不转换为字符串并返回
Converting n to 0.n without converting to a string and back
是否有数学上合理且简单的方法将整数值 (n) 转换为等于 0.n 的新小数或浮点值?一个例子是将 123 作为输入并产生 0.123.
我目前想到的方式涉及:
- 将整数转换为字符串。
- 追加“0”。到字符串的前面。
- 将字符串转换为 decimal/float.
但是有没有一种方法可以做到这一点而不必转换为字符串并返回不可能出现舍入错误?
你可以这样做:
decimal d = 0;
if(n < 10) d = 10
else if(n < 100) d = 100
else if(n < 1000) d = 1000
else if(n < 10000) d = 10000
else if(n < 100000) d = 100000
....
var result = n / d;
下面是这样做的,但像往常一样,你需要依赖你的语言的浮点表示。避免舍入错误将取决于语言。
while (n>=1) {
n /= 10.;
}
return n
你用对数函数求出数的"length":
int length = (int)(Math.log10(n)+1);
然后你可以简单地将你的数字除以 10 的长度次方:
double number = n / pow(10, length);
是否有数学上合理且简单的方法将整数值 (n) 转换为等于 0.n 的新小数或浮点值?一个例子是将 123 作为输入并产生 0.123.
我目前想到的方式涉及:
- 将整数转换为字符串。
- 追加“0”。到字符串的前面。
- 将字符串转换为 decimal/float.
但是有没有一种方法可以做到这一点而不必转换为字符串并返回不可能出现舍入错误?
你可以这样做:
decimal d = 0;
if(n < 10) d = 10
else if(n < 100) d = 100
else if(n < 1000) d = 1000
else if(n < 10000) d = 10000
else if(n < 100000) d = 100000
....
var result = n / d;
下面是这样做的,但像往常一样,你需要依赖你的语言的浮点表示。避免舍入错误将取决于语言。
while (n>=1) {
n /= 10.;
}
return n
你用对数函数求出数的"length":
int length = (int)(Math.log10(n)+1);
然后你可以简单地将你的数字除以 10 的长度次方:
double number = n / pow(10, length);