• Float 运算的怪异性


    我自己有开发了一个股票自动交易软件。

    背景:原来我所有的金钱计算用的都是decimal类型。然后后面我看行情数据哪边大部分人用的都是float类型。于是我也决定将所有的类型全部都换成了float类型。

    然后最近怪事就来了,第一次进行买入的时候都是没有办法掇合成功。再接下来用很少的钱进行购买的时候却可以成功了。

    但是看一下剩下的钱变成负的了。非常的神奇。

    第一次为什么会没有办法掇合成功呢。

    买 的掇合是一件很简单的事情。经过分析发现原来在进行买掇合的时候我会用进行一下花的钱和剩下来的现金进行一下比较。

    如果钱不过的话当然是不可能买入的了。

    这样我知道我的最大可买数量肯定是算错了。

    后面发现 原来 float有一个bug

    我在计算最大可买 数量的时候 最终是转换成 int类型。

    用LinqPad对下面的进行一下测试

        float k =1.999999999999998f;
        
        int i = (int)k;
        i.Dump();
        
        decimal k2 = 1.999999999999999999999999m;
        int i2 = (int)k2;
        i2.Dump();
        
        int i3 = (int)(decimal)k;
        i3.Dump();

     发现结果是 212 就是float在转成其它类型的时候并不是严格舍去小数点后面位数。

    void Main()
    {
        float m= (1/100)*100;
        int k = (int)m;
        "第一个测试".Dump();
        k.Dump();
        
        float m2 = 1;
        int k2 = (int)m2;
        "第二个测试".Dump();
        k2.Dump();
        
        decimal m3 = (1/100);
        "第三个测试".Dump();
        m3.Dump();
        int k3 = (int)(m3*100);
        
        k3.Dump();
        
        decimal m4 = (1m/100m);
        "第四个测试".Dump();
        m4.Dump();
        int k4 = (int)(m4*100m);
        k4.Dump();
    }

    第一个测试 

    0

    第二个测试 

    1

    第三个测试 

    0

    0

    第四个测试 

    0.01

    1

    从这边你可以看出来一些东西的。

  • 相关阅读:
    删除某个目录下面指定名字的文件夹的命令
    ubuntu 12.04 下面安装vmware workstation 8.0.4
    最近一段时间总结
    ejb 学习笔记HelloWorld入门实例
    状态会话bean的session周期与Web上的session周期
    ubuntu做路由器
    Heron and His Triangle 递推 高精度 打表 HDU6222
    洛谷训练赛 A.Misaka Network
    HZNU Training 1 for Zhejiang Provincial Competition 2020 Xeon第三场训练赛
    莫比乌斯反演
  • 原文地址:https://www.cnblogs.com/lovebanyi/p/2231223.html
Copyright © 2020-2023  润新知