2017-02-10 30 views
-1

下面是代碼從我的腳本的小片段:大整數塗布操作之後改變其值

加入的邏輯是隱蔽的任何數據值按比例值

x = "11400000206633458812"  
scale = 2  
x = x.to_f/10**scale.to_i  
x = x == x.to_i ? x.to_i : x  
puts x 

觀察到值出現爲「114000002066334592」

這與x的初始值不同。

我的測試點在這一點上失敗。

x可以是任何值。如果我使用x = 156,那麼輸出是正確的,但是當整數的長度超過16位時,就會出現問題。

在上述情況下的預期結果是114000002066334588

任何人可以幫助我,爲什麼值正在改變,以及如何解決它?

+0

@AndreyDeineko,X實際上是一個字符串。如果我使用x.to_d,它給我的錯誤:未定義的方法'to_d」爲 「11400000206633458812」:字符串(NoMethodError) –

+1

_」大整數更改它們的值「_ - 'x.to_f'不返回整數。 – Stefan

回答

0

The expected output in above case is 114000002066334588

根本不是。

人們不能期望浮點運算是精確的。那隻不過是而非because of processor architecture。在全部語言中,無一例外,都有解決方法來精確處理小數。在紅寶石它BigDecimal

require 'bigdecimal' 

BigDecimal("11400000206633458812")/100 
#⇒ 0.11400000206633458812E18 

(BigDecimal("11400000206633458812")/100).to_i 
#⇒ 114000002066334588