gpt4 book ai didi

c - C 中的舍入 float

转载 作者:太空宇宙 更新时间:2023-11-04 01:21:40 25 4
gpt4 key购买 nike

在测试浮点类型并使用它的格式说明符 %f 打印它时,我正在测试它的舍入方法。

我已将变量声明为 float 并赋予它值 5.123456。如您所知, float 必须至少代表 6 位有效数字。

然后我将其值更改为 5.1234567 并使用 %f 打印该值。令我困惑的是,为什么它打印出来是 5.123456。但是,如果我将变量值更改为 5.1234568,它会打印为 5.123457。它正确地四舍五入。

如果我没有说清楚或者解释的很困惑:

float a = 5.1234567
printf("%d", a);
// prints out as 5.123456

float a = 5.1234568
printf("%d", a);
// prints out as 5.123457

我使用 CodeBlocks 和 MinGW 编译,结果相同。

最佳答案

OP 正在经历 double rounding 的影响

首先,值 5.123456、5.1234567 等被编译器四舍五入到最接近的可表示 float 。然后 printf() 舍入 float 值到最接近的 0.000001 十进制文本表示。


I've declared the variable as float and gave it the value 5.123456. As you know float must represent at least 6 significant figures.

float 可以表示大约 2^32 个不同的值。 5.123456 不是其中之一。典型的 float 可以表示的最接近值是 5.12345600128173828125 并且对于 6 个 significant 数字是正确的:5.12345...

float x = 5.123456f;
// 5.123455524444580078125 representable float just smaller than 5.123456
// 5.123456 OP's code
// 5.12345600128173828125 representable float just larger than 5.123456 (best)

// The following prints 7 significant digits
// %f prints 6 places after the decimal point.
printf("%f", 5.123456f); // --> 5.123456

对于 5.1234567,最接近的 float 的精确值为 5.123456478118896484375。使用 "%f" 时,预计打印结果四舍五入到最接近的 0.0000015.123456

float x = 5.1234567f;
// 5.123456478118896484375 representable float just smaller than 5.1234567 (best)
// 5.1234567 OP's code
// 5.1234569549560546875 representable float just larger than 5.1234567

// %f prints 6 places after the decimal point.
printf("%f", 5.1234567f); // --> 5.123456

有效位数不是小数点后的位数。它是从最左边(最高有效位)的数字开始的位数。

要将 float 打印为 6 位有效数字,请使用 "%.*e"
有关详细信息,请参阅 Printf width specifier to maintain precision of floating-point value

float x = 5.1234567;         
printf("%.*e\n", 6 - 1, x); // 5.12346e+00
// x xxxxx 6 significant digits

关于c - C 中的舍入 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41127498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com