当我尝试提取 double 的小数部分时,它似乎在 C 中四舍五入,有没有办法在不四舍五入的情况下做到这一点?
double t = 8.2;
int ipart = (int)t;
long long val = abs((long long)(t*1000000));
long long fpart = (val)%1000000;
fpart 给出 199999,有没有办法在不四舍五入的情况下将其设为 200000?尝试了很多方法,但似乎没有一种方法适用于所有数字。
目的是最终将此双精度值转换为字符串,该字符串的确切值应为“8.20000”。如果我可以在 long long 变量中提取分数部分,那么我可以使用 snprintf 生成字符串。
如何在不舍入的情况下提取双精度值的小数部分......?
使用modf()
标准 C 库。
#include <math.h>
double ipart;
double fraction = modf(value, &ipart);
printf("Fraction %g\n", fraction);
printf("Whole number %g\n", ipart);
这些
modf
函数将参数值分解为整数部分和小数部分,每个部分都与参数具有相同的类型和符号。它们将整数部分(以浮点格式)存储在 iptr 指向的对象中。
C17dr § 7.12.6.12 2
深入了解 8.2
double
可以精确地表示大约 2 64 个不同的值。8.2不是其中之一。
与double t = 8.2;
,t
取一个附近的值,由于二进制 9 的共同性质,它恰好是 8.19999999999999289457264239899814128875732421875 或
8 1801439850948192 / 9007199295474double
。
要找到分数,请使用fraction*pow(2,DBL_MANT_DIG)/pow(2,DBL_MANT_DIG)
。
因此,“将其设为 200000而无需四舍五入”的目标为 200000/分母的分数部分t
是不可能的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句