|  |      1bombless      2013-12-11 10:57:55 +08:00 因为一个是单精度浮点数一个是双精度浮点数。 你把C语言里那个float换成double,就可以看到输出还是57. | 
|  |      2master      2013-12-11 11:03:26 +08:00 首先需要明白的是浮点数在计算机(二进制)中的存储方式的特殊性。 另外你用了类型转换,所以这个已经不算存储精度的问题,而是转换策略的问题 | 
|  |      3christianwong OP @master 恩,应该是你说的这个,php不会做相应的优化,而gcc可以 | 
|  |      4oldcai PRO 你%d当然是58,%f看看? | 
|  |      5justfindu      2013-12-11 11:11:24 +08:00 | 
|  |      6christianwong OP @bombless 确实换成double就会输出57,原来php中的浮点数都是双精度的 | 
|  |      7christianwong OP @justfindu 确实是看过这个文章之后想起的一个问题 | 
|  |      8mille      2013-12-11 11:11:49 +08:00 只要把浮点值赋给整形变量,小数点后面的都会被删节 | 
|  |      9christianwong OP @oldcai %f输出的竟然全是0 | 
|  |      10oldcai PRO float a = f*100; printf("%f\r\n", a); | 
|  |      11bombless      2013-12-11 11:17:51 +08:00 如果不是出于存储或者网络传输的目的,单精度浮点数根本没有什么用。 所以多数编程语言根本就没有单精度浮点数只有双精度浮点数。 不过在计算机图形这一块,内存到显存的传输消耗很高,存储也很宝贵,甚至有使用双字节长的浮点数的。 | 
|  |      12christianwong OP @oldcai 仍然输出58 | 
|  |      13christianwong OP @bombless 多谢,长见识了 | 
|  |      14oldcai PRO @christianwong 已测试,输出58.000000,你看看是不是哪里出问题了。 prove.c: #include<stdio.h> int main(void) { float f = 0.58; float a = f*100; printf("%f\r\n", a); return 0; } gcc -Wall prove.c -o prove | 
|      15jiji9081      2013-12-11 16:52:22 +08:00 我觉得是转换策略的问题。 单精度浮点数的精度大概是6~7位有效数字,对付这种情况绰绰有余。 float f = 0.58; a = f*100.0; 得到结果是57 但是 float f = 0.58; f = f * 100; a = f; 结果是58 事实上,在float f = 0.58这里已经存在有误差,实际保存的值换算成10进制是0.5799999237060547 那么×100后得到的就是57.99999237....这样的 两种策略一种是扔掉小数点,一种是舍入为最接近值 @oldcai | 
|  |      17oldcai PRO 你出现的情况实在是比较奇怪,我以为是你没有把int a改成float a | 
|  |      18skydiver      2013-12-11 17:31:55 +08:00 所以一般都是用 $b = intval(round($a)); |