關於C builder中精度丟失的問題

2021-07-03 15:59:00 字數 738 閱讀 5295



原意:現有應交款項m元,折扣率n(0 < n < 1),折扣金額採取向下取整制,求折扣後金額lastmoney

公式:lastmoney = m - ( m * ( 1 - n ) )

現設m 為 14.25元  折扣率n為0.8 根據公式計算:

int norginmoney = 1425;**換成分為單位進行計算)

double drebate  = 0.8;

int tempmoney  = 

norginmoney * (1 - drebate );

int nlastmoney = norginmoney - 

tempmoney ;

上面的做法存在精度丟失的問題,tempmoney 為整形,而等號右邊的計算賦值得出的是浮點數,在進行轉換的時候會對小數點後面進行截斷。雖然這符合向下取整的規則,但是在上面的例子當中,右邊 norginmoney * (1 - drebate )算出來的是285.00,而轉成int型別之後放在tempmoney當中時,tempmoney的值為284,究其原因,右邊的double計算值在記憶體當中進行儲存的值並非285.00,而應該是284.9999***x,而這樣直接進行強制轉換會照成了精度的丟失。正確的型別轉換並向下取整應該如下:

int tempmoney  = norginmoney * (100 - (int)(drebate*100) ) / 100;

將折扣率進行放大並裝換成int進行計算,放大係數由折扣率的精度決定。

ORACLE NUMBER丟失精度

oracle的number可以支援到38位精度。超過15位存進去,就用科學記數法表示的,而且精度丟失了。例 1234567890123456 插入後 1.23456789012346e15 123456789025587.22 插入後 123456789025587.00 補足 此處的精度丟失是,s...

float double精度丟失

本文參考略加補充。都知道十進位制整數轉換二進位制 2 十進位制小數轉換二進位制 2 取 整 但小數有時乘不盡。結論 1 整數永遠可以用二進位制精確表示 2 小數的二進位制表示有時是不可能精確的 正如十進位制不法表示1 3,二進位制也無法表示1 10 這也就解釋了為什麼浮點型減法出現了 減不盡 的精度...

double精度丟失

include includeint main 輸出 124 include includeint main 輸出 125 include includeint main 輸出 125 include includeint main 輸出 1 輸出均正確 include includeint mai...