我自己有开发了一个股票自动交易软件。
背景:原来我所有的金钱计算用的都是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();
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();
}
{
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
从这边你可以看出来一些东西的。