台灣最大程式設計社群網站
線上人數
1681
 
會員總數:241330
討論主題:186904
歡迎您免費加入會員
[ 變換順序 ]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
浮點數誤差
價值 : 50 QP  點閱數:123 回應數:1

樓主

Sanji
門外漢
0 24
343 62
發送站內信

大家好
小弟想請問一下大家有關浮點數誤差的問題
問題如下
小弟在做浮點數運算時沒出錯,但是iframe提交出去,紀錄的值會變成誤差值
(浮點數是在iframe中做運算)
而且我發現只有在 兩數相加 - 1數這種多對一的情況才會發生
若是兩數相加-兩數相加就不會發生
舉例(多對一):
第一筆資料 值 1953.21
第二筆資料 值 2617.82
第三筆資料 值 -4571.03
把這三個加總 答案會先呈現0 這是對的
但是一但 obj.submit()
馬上值會被竄改成9.094947017729282e-13

而多對多
第一筆資料 值 1953.21
第二筆資料 值 2617.82
第三筆資料 值 -4570.01
第四筆資料 值 -1.02
這樣的結果就會一直是0

照理來說 obj.submit()是不會去動到計算的 所以我不明白原因為何(最多到小數點兩位)
以下iframe中浮點數運算的code:


這是iframe 的html中呼叫account的code:




這是提交的code:



最終的值應該要紀錄在父頁的欄位
以下是父頁該欄位的html的code:

其中的$ra[dcd_amount]是抓資料庫的值 資料庫是由iframe計算完後存入的 我看過 都是0
麻煩各位大大幫幫我
謝謝

搜尋相關Tags的文章: [ javascript ] , [ 浮點數 ] , [ html ] ,
本篇文章發表於2017-11-25 01:18
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
其實這是所有程式員的痛。

詳細情況我沒辦法跟你說的很清楚。
這樣的現像不只在這邊,其實無論是sql或是其它應用程式。
都會發生這樣的情況。+-不會有很大的問題,但一但*/處理就很容易發生這樣的所謂補位點的事情發生。

一般來說會發生這樣的情況大多都是在做類型轉換處理時。很容易發生這樣的事。
我曾經有找過這方面的事。大約是指電腦程式其實並不會做乘除的動作。而是採用一種叫「補位」的方式做處理。
所以常會發生相差0.000000?的情況。

一般要解決這樣的方式,只能利用一下round了。將他的值做一下小數點處理。
會出現像是尾數有e這樣的值的,就是小數位數太多。所以會出現這樣的數值出現。

但可惜的是,javascrip並沒辦法做小數點的指定計算。比較常用的方式就是*100後round處理完再做*0.01。
我有注意到其實你在33行有做這樣的處理。如果還是會發生的話。
那就只好從源頭數值來做處理了。

php的部份也會有這樣的情況。所以有時我從view輸出時。也會不得已的採用round的方式來處理。


本篇文章回覆於2017-11-27 19:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
[ 變換順序 ]   
1

回覆
如要回應,請先登入.