【发布时间】:2015-01-28 22:02:57
【问题描述】:
问题
有时即使不等式检查表明该数字不是负数,零值的浮点数也会被打印为负零。
应用
我正在尝试以人类可读的格式注销 UIView 的转换矩阵。数字应该这样排列:
- (void) describe
{
NSLog(
@"|%@%.2f %@%.2f 0.00|\n|%@%.2f %@%.2f 0.00|\n|%@%.2f %@%.2f 1.00|",
self.transform.a < 0 ? @"" : @" ",
self.transform.a,
self.transform.b < 0 ? @"" : @" ",
self.transform.b,
self.transform.c < 0 ? @"" : @" ",
self.transform.c,
self.transform.d < 0 ? @"" : @" ",
self.transform.d,
self.transform.tx < 0 ? @"" : @" ",
self.transform.tx,
self.transform.ty < 0 ? @"" : @" ",
self.transform.ty
);
}
我在非负数前面放置空格以匹配负数的宽度。在某些情况下,数字排列:
| 0.00 -1.00 0.00|
| 1.00 0.00 0.00|
| 0.00 0.00 1.00|
对视图应用几次旋转后,数字不再排列:
| -0.00 -1.00 0.00|
| 1.00 -0.00 0.00|
| 0.00 0.00 1.00|
在上述情况下,self 的 NSLog 将转换打印为:
transform = [-0, -1, 1, -0, 0, 0];
问题是零值被记录为负零,但被检测为非负。如果我能理解这个神秘的负零是如何存在的,那么我就可以解决我的格式问题。
【问题讨论】:
-
负零是非负的;它是零。 en.wikipedia.org/wiki/Signed_zero 但是你为什么不直接使用字段格式而不是这么费劲呢?例如:
NSLog( @"|%5.2f %5.2f 0.00|\n|%5.2f %5.2f 0.00|\n|%5.2f %5.2f 1.00| ... -
@CarlNorum 嘿,你用这个(+1)击败了我几秒钟
-
浮点值具有尾数、指数和符号分开,因此它们能够存储
+0和-0,它们是相同的......符号是上次操作留下的具有这样的值.. . -
@CarlNorum 我尝试了你的格式化方式,但是小数点前面的“5”只是设置了小数点左侧的最大数字范围。它会填充小数字。
-
@Pwner,它设置整数的字段宽度,而不仅仅是小数点的左边。填充有什么问题?你想让数字排成一行,对吧?
标签: objective-c cocoa-touch math matrix transform