c - 将 float 结果保存到第三位,C 中不四舍五入

标签 c floating-point rounding math.h trigonometry

如何将结果四舍五入到第三位后的第三位。

float result = cos(number);

请注意,我要将结果保存到第三位,不四舍五入。不,我不想用 .3f 打印它,我需要将它保存为新值;

例子:

 0.00367 -> 0.003

注意3 之后不需要额外的零。

此外,我需要能够获得第 3 位数字。例如,如果它是 0.0037212,我想获取 3 并将其用作某些计算中的 int。

最佳答案

0.00367 -> 0.003

float 通常可以准确表示大约 232 个不同的值。 0.003670.003 不在该集合中。

最接近0.00367float是0.0036700000055134296417236328125
最接近 0.003__float 是 0.0030000000260770320892333984375

I want to save the result up to the third digit

这个目标需要妥协。将结果保存为接近 0.001 倍数的 float

按 1000.0 缩放、截断和除以 1000.0 将适用于大多数值。

float y1 = truncf(x * 1000.0f) / 1000.0f;

上面给出了一个稍微错误的答案,其中一些值接近 x.xxx000...x.xxx999...。使用更高的精度可以解决这个问题。

float y2 = (float) (trunc(x * 1000.0) / 1000.0);

I want to get the 3 and use it as an int in some calculation.

跳过非缩放部分,使用fmod()只保留1位。

int digit = (int) fmod((trunc(x * 1000.0), 10);
digit = abs(digit);

最后,我怀疑这种方法不会完全满足 OP 未说明的“在某些计算中将其用作 int”。 FP 数学有很多副标题,尤其是在尝试使用 binary FP 时,就像大多数 double 一样,以某种decimal 的方式。

也许以下将满足 OP 的目标,即使它做了一些舍入。:

int third_digit = (int) lround(cos(number)*1000.0) % 10;
third_digit = abs(third_digit);

关于c - 将 float 结果保存到第三位,C 中不四舍五入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45063993/

相关文章:

c - 尽管有用户输入,为什么我的变量被分配为 0?

java - 通过反射获取 Java 字段,而不是通过其 String 名称

c++ - 使用 std::ofstream 在 C++ 中格式化浮点变量输出

matlab - 我怎样才能舍入到一定的浮点精度?

c++ - 如何进行带有偏差的浮点舍入(总是向上或向下舍入)?

c - 为 union 结构的字段赋值的意外行为

c - (size + 7) & ~7 是什么意思?

c - 网络链接套接字

c - 浮点计算C错误结果

android - 如何在 Java 中将 double 舍入到小数点后两位?