如何在c中不四舍五入地提取双精度值的小数部分
How to extract fractional part of a double value without rounding in c
当我尝试提取 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?尝试了很多方法,但 none 的方法似乎适用于所有数字。
目的是最终将此双精度转换为字符串,该字符串的确切值应为“8.20000”。如果我可以提取 long long 变量中的小数部分,那么我可以使用 snprintf 生成字符串。
值 8.2 无法用二进制浮点数精确表示。实际值更接近8.19999999999999929.
因此,您被迫四舍五入:
long long val = llabs(round(t*1000000));
或在转换前将值加 0.5:
long long val = llabs((t*1000000) + 0.5);
How to extract fractional part of a double value without rounding ...?
使用标准 C 库中的 modf()
。
#include <math.h>
double ipart;
double fraction = modf(value, &ipart);
printf("Fraction %g\n", fraction);
printf("Whole number %g\n", ipart);
The modf
functions break the argument value into integral and fractional parts, each of which has the same type and sign as the argument. They store the integral part (in floating-point format) in the object pointed to by iptr.
C17dr § 7.12.6.12 2
深入了解 8.2
double
可以表示大约 264 个不同的值 正好 。 8.2 不是其中之一。
对于 double t = 8.2;
,t
取一个附近的值,正好是 8.199999999999999289457264239899814128875732421875 或
81801439850948192/9007199254740992 由于常见的二进制性质 double
.
要找到分数,请使用 fraction*pow(2,DBL_MANT_DIG)/pow(2,DBL_MANT_DIG)
.
因此,对于 t
的小数部分,“不四舍五入 得到 200000 ”作为 200000/分母的目标是不可能的。
当我尝试提取 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?尝试了很多方法,但 none 的方法似乎适用于所有数字。
目的是最终将此双精度转换为字符串,该字符串的确切值应为“8.20000”。如果我可以提取 long long 变量中的小数部分,那么我可以使用 snprintf 生成字符串。
值 8.2 无法用二进制浮点数精确表示。实际值更接近8.19999999999999929.
因此,您被迫四舍五入:
long long val = llabs(round(t*1000000));
或在转换前将值加 0.5:
long long val = llabs((t*1000000) + 0.5);
How to extract fractional part of a double value without rounding ...?
使用标准 C 库中的 modf()
。
#include <math.h>
double ipart;
double fraction = modf(value, &ipart);
printf("Fraction %g\n", fraction);
printf("Whole number %g\n", ipart);
The
modf
functions break the argument value into integral and fractional parts, each of which has the same type and sign as the argument. They store the integral part (in floating-point format) in the object pointed to by iptr.
C17dr § 7.12.6.12 2
深入了解 8.2
double
可以表示大约 264 个不同的值 正好 。 8.2 不是其中之一。
对于 double t = 8.2;
,t
取一个附近的值,正好是 8.199999999999999289457264239899814128875732421875 或
81801439850948192/9007199254740992 由于常见的二进制性质 double
.
要找到分数,请使用 fraction*pow(2,DBL_MANT_DIG)/pow(2,DBL_MANT_DIG)
.
因此,对于 t
的小数部分,“不四舍五入 得到 200000 ”作为 200000/分母的目标是不可能的。