如何在不更改精确值的情况下使用c将double的小数部分转换为字符串或将double的小数部分转换为整数
How to convert fractional part of double to string or fractional part of double to integer using c without changing exact value
有没有办法在不改变值的情况下将double转换成string?或者有没有办法将数字的小数部分截断到一定的小数精度并存储在 long 中?转换似乎向上或向下舍入,这在我的情况下不起作用。
double t = 8.299877766666;
要么是包含完全相同值的字符串,要么是被截断为特定小数精度的字符串,例如包含“299877766666”或“0.29987”的字符串?
不确定您尝试了什么,但天真的方法对我有用:
uint64_t frac_dig(double x, int digits)
{
// 20 non-zero digits will overflow a 64bit integer
assert(0 < digits && digits < 20);
// remove non-fractional digits, and strip off sign
x = fabs(fmod(x, 1));
uint64_t result = 0;
while (digits-- > 0) {
x *= 10;
result *= 10;
int i = x;
result += i;
x -= i;
}
return result;
}
测试通过
double t = -8.299877766666;
printf("%.24f = %lu\n", t, frac_dig(t, 19));
打印出来
-8.299877766666000411532877 = 2998777666660004115
请注意,浮点值是 base-2 编码的,而不是十进制的。这可能会导致您的一些“舍入问题”。例如,可以用 double 表示的最接近的值略大于您问题中的值,如通过 printf
.
打印出额外数字时所示
有没有办法在不改变值的情况下将double转换成string?或者有没有办法将数字的小数部分截断到一定的小数精度并存储在 long 中?转换似乎向上或向下舍入,这在我的情况下不起作用。
double t = 8.299877766666;
要么是包含完全相同值的字符串,要么是被截断为特定小数精度的字符串,例如包含“299877766666”或“0.29987”的字符串?
不确定您尝试了什么,但天真的方法对我有用:
uint64_t frac_dig(double x, int digits)
{
// 20 non-zero digits will overflow a 64bit integer
assert(0 < digits && digits < 20);
// remove non-fractional digits, and strip off sign
x = fabs(fmod(x, 1));
uint64_t result = 0;
while (digits-- > 0) {
x *= 10;
result *= 10;
int i = x;
result += i;
x -= i;
}
return result;
}
测试通过
double t = -8.299877766666;
printf("%.24f = %lu\n", t, frac_dig(t, 19));
打印出来
-8.299877766666000411532877 = 2998777666660004115
请注意,浮点值是 base-2 编码的,而不是十进制的。这可能会导致您的一些“舍入问题”。例如,可以用 double 表示的最接近的值略大于您问题中的值,如通过 printf
.