我收到交易分配的FIX消息,其中價格在美分(ZAR/100)中給出,但佣金在蘭特中給出。這些值由常數表示。當我運行這個計算時,commPerc1
顯示值爲0.099999999999999978,而commPerc2
顯示爲0.1。這些值看起來相差x10,但隨着計算回到蘭德,commRands1
和commRands2
分別顯示非常相似的值336.4831554和336.48315540000004。這個C#財務計算中的浮點問題在哪裏?
private const double Price = 5708.91;
private const double Qty = 5894;
private const double AbsComm = 336.4831554;
static void Main()
{
double commCents = AbsComm * 100;
double commPerc1 = commCents/(Qty * Price) * 100;
double commRands1 = (Qty * Price) * (commPerc1/100)/100;
double commPerc2 = (AbsComm/(Qty * (Price/100))) * 100;
double commRands2 = (Qty * Price) * (commPerc2/100)/100;
}
請注意: 我處理的遺留代碼在這裏,其中一個轉換爲十進制會涉及一些變化和QA,所以現在我必須接受double
。
憑啥你用'double',而不是'Decimal'的財務計算? – CodesInChaos 2011-04-26 08:49:11
你在哪裏看到10倍的差異? '0.099 ... = 0.1',你看到的是一些浮點錯誤的影響,沒有什麼特別的。 'commPerc1'等於'commPerc2',忽略那些微不足道的錯誤。 – Darhuuk 2011-04-26 08:56:09