如何在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?尝试了很多方法,但似乎没有一种方法适用于所有数字。

目的是最终将此双精度值转换为字符串,该字符串的确切值应为“8.20000”。如果我可以在 long long 变量中提取分数部分,那么我可以使用 snprintf 生成字符串。

chux - 恢复莫妮卡

如何在不舍入的情况下提取双精度值的小数部分......?

使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不舍入小数点值的情况下获得精确的小数精度值?

Pandas Dataframe如何在不舍入的情况下截断浮点小数点?

如何在不舍入的情况下截断BigDecimal

如何在不舍入的情况下将点后的值修剪到两个位置,python

如何在不快速舍入的情况下划分双精度值?

熊猫在不舍入的情况下截断列值

如何在不知道流精度的情况下在文件中写入双精度值

如何在没有 .0 的情况下打印双精度值

使用Java如何在没有科学计数法的情况下打印双精度值?

在不更改数据类型的情况下将双精度舍入为 2 位小数

如何从C#中的双精度值修剪小数

如何将双精度值格式化为不带货币符号且不带小数的特殊情况下的价格

在不使用%f的情况下从双精度转换为字符串的舍入错误

如何在不使用双精度的情况下使用BigDecimals

如何在不更改Metric类型的情况下使函数返回双精度?

如何在不丢失结构的情况下将 NESTED 列表强制为双精度(R)

如何在C#中获取小数的舍入值

如何检查双精度值是否没有小数部分

如何在将双精度值转换为字符串后从双精度值中删除小数点

如何在不迭代数组的情况下提取对象数组中特定键的值?

舍去小数位而不舍入值

如何优化Spark函数以将双精度值舍入为2个小数?

Spark Dataframe中没有小数点的双精度值的舍入

如何删除不舍入的尾随小数?

在特定情况下如何在python中舍入任何数字

从双精度数中获取小数部分

在Swift中获取双精度的小数部分

如何在避免不确定行为的情况下将任意双精度数转换为整数?

如何在不考虑行的特定部分的情况下删除包含部分 Nan 值的行?