同事写 C#代码的时候遇到了一个奇怪的类型转换问题 string->double->float

2017-09-18 14:59:52 +08:00
 VShawn

正撸着 python,然后隔壁桌一个问题打得我措手不及

直接看图吧

55555555 从 string 到 double 再到 float 后变成了 55555556,哪位大佬给解释一下原因?

2334 次点击
所在节点    程序员
13 条回复
sun1991
2017-09-18 15:03:55 +08:00
精度损失吧, 正常的现象. 不要用 float.
ryd994
2017-09-18 15:12:30 +08:00
单精度浮点只有 7 位有效数字( 24 位二进制)
lommo
2017-09-18 15:15:52 +08:00
少用 float 就好了
VShawn
2017-09-18 15:17:06 +08:00
@sun1991
@ryd994

可是直接

double x = 555555;
float y = (float) x;
就不会变成 555556
LMkillme
2017-09-18 15:17:12 +08:00
IEEE754 标准
lommo
2017-09-18 15:20:33 +08:00
@VShawn
double x = 55555555;
float y = (float)x;
flyingghost
2017-09-18 15:22:08 +08:00
浮点数是有范围和精度的。
http://www.cnblogs.com/BradMiller/archive/2010/11/25/1887945.html
可以照这个文章自己手算一遍。
hjc4869
2017-09-18 15:24:30 +08:00
怎么天天都有人发这种问题,上周是 Java 和 JS,这周又冒出 .NET ,好好学一下计算机相关专业的本科课程会死吗
sun1991
2017-09-18 15:28:06 +08:00
double x = 55555555;
float y = (float)x;
Console.WriteLine(y);

output:
5.555556E+07

所以在我的机器上, 输出结果是一样的.
VShawn
2017-09-18 15:40:24 +08:00
@lommo 原来是同事少写了个 5 !!!

2333 大乌龙
VShawn
2017-09-18 15:42:19 +08:00
@hjc4869 得了吧,谁不知道这是精度转换的问题啊,我问的是为啥 str 到 double 到 float 跟直接 double 到 float 会有差。
现在发现是个乌龙了,我运行前应该数一下到底有几个 5 的。
hjc4869
2017-09-18 16:15:54 +08:00
@VShawn 可是你原帖中并没有说直接从 double 到 float 啊,你看在我前面回复的有几个不是认为你不懂 IEEE754,float/double 精度问题?问问题能不能描述清楚一些。
VShawn
2017-09-18 16:42:28 +08:00
@hjc4869 是我的疏忽,下次注意。
但是领导走来走去,很难保持一个稳定的提问输出。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/391658

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX