%.1f\n1.35 ->-6ren">
gpt4 book ai didi

objective-c - 使用 %.1f 时打印出意外值

转载 作者:搜寻专家 更新时间:2023-10-30 19:57:53 25 4
gpt4 key购买 nike

我试图将 float 显示到小数点后一位。我得到如下意想不到的结果:

代码:

float a = 1.25;
float b = 1.35;

NSLog(@"1.25 -> %.1f\n1.35 -> %.1f",a,b);

输出:

1.25 -> 1.2

1.35 -> 1.4

预期输出,要么:

1.25 -> 1.3

1.35 -> 1.4

或:

1.25 -> 1.2

1.35 -> 1.3

这仅仅是因为二进制和十进制之间的内部转换吗?如果是这样,我如何获得预期的行为?

我使用的是 Xcode 4.6。

编辑:好的,感谢 TonyK 和 H2CO3,这是由于小数的二进制表示。

float a = 1.25;
float b = 1.35;
NSLog(@"1.25 -> %.30f\n1.35 -> %.30f",a,b);

1.25 -> 1.250000000000000000000000000000

1.35 -> 1.350000000000000088817841970013

很多有用的信息,但据我所知,没有人回答过第二个问题:如何获得预期的行为?

Rounding numbers in Objective-C是一个完全不同的问题。

最佳答案

1.35是27/20,二进制是

1.01 0110 0110 0110 0110 0110 0110....

float 在大多数系统上有一个 23 位的尾数(不包括隐含的前导 1),因此它被四舍五入为

1.01 0110 0110 0110 0110 0110 1

(因为 0110 明确大于 1000 的一半)。所以当 printf 看到它时,它严格大于 1.35。因此 1.4。

至于 1.25,这可以用二进制表示为

1.01

所以 printf 看到了它的确切值。但是它应该如何舍入 1.25?我们在学校被教导将 5 舍入到 10。但是大多数现代系统在硬件级别使用称为“舍入到偶数”的默认舍入模式,因为它减少了累积舍入误差的影响。这意味着当一个数字恰好位于两个最接近的四舍五入候选者之间时,它会四舍五入到偶数候选者。

看来 print 对十进制输出使用“四舍五入”!我在 this ideone link 检查了这个假设,实际上 1.75 被四舍五入为 1.8。这对我来说是一个惊喜,但不是很大。

关于objective-c - 使用 %.1f 时打印出意外值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15728277/

25 4 0
文章推荐: php - 如何使用