V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
VShawn
V2EX  ›  程序员

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

  •  1
     
  •   VShawn ·
    VShawn · 2017-09-18 14:59:52 +08:00 · 2333 次点击
    这是一个创建于 2409 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    直接看图吧

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

    第 1 条附言  ·  2017-09-18 15:45:36 +08:00

    我想问的是为啥 str 到 double 到 float 跟直接 double 到 float 会有差。 现在发现是个乌龙,同事发给我的代码两边5的个数不一样!

                string str = "55555555";
                double x = double.Parse(str);
                float y = (float) x;
                double x1 = 5555555;
                float y1 = (float)x1;
    

    于是后面那个没损失精度 我运行前应该数一下到底有几个 5 的 /捂脸。

    sun1991
        1
    sun1991  
       2017-09-18 15:03:55 +08:00
    精度损失吧, 正常的现象. 不要用 float.
    ryd994
        2
    ryd994  
       2017-09-18 15:12:30 +08:00 via Android
    单精度浮点只有 7 位有效数字( 24 位二进制)
    lommo
        3
    lommo  
       2017-09-18 15:15:52 +08:00
    少用 float 就好了
    VShawn
        4
    VShawn  
    OP
       2017-09-18 15:17:06 +08:00
    @sun1991
    @ryd994

    可是直接

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

    output:
    5.555556E+07

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

    2333 大乌龙
    VShawn
        11
    VShawn  
    OP
       2017-09-18 15:42:19 +08:00
    @hjc4869 得了吧,谁不知道这是精度转换的问题啊,我问的是为啥 str 到 double 到 float 跟直接 double 到 float 会有差。
    现在发现是个乌龙了,我运行前应该数一下到底有几个 5 的。
    hjc4869
        12
    hjc4869  
       2017-09-18 16:15:54 +08:00
    @VShawn 可是你原帖中并没有说直接从 double 到 float 啊,你看在我前面回复的有几个不是认为你不懂 IEEE754,float/double 精度问题?问问题能不能描述清楚一些。
    VShawn
        13
    VShawn  
    OP
       2017-09-18 16:42:28 +08:00
    @hjc4869 是我的疏忽,下次注意。
    但是领导走来走去,很难保持一个稳定的提问输出。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2887 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 15:31 · PVG 23:31 · LAX 08:31 · JFK 11:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.