2016-03-14 55 views
0

我正在採用二進制字符串並將其解碼爲浮點數組。我有那一部分想通了。如果是最後一位小數,紅寶石將切斷0十進制

我現在必須將該數組和格式化爲剩餘三位小數,並且舍入爲無。我所有的數字都是正確的,但無論出於何種原因,如果第三位小數點是0,那麼Ruby會將其切斷,我需要包含這些0。

例如:

預計:

3.480 

我的輸出:

3.48 

我如何可以截斷浮點數到小數點後三位,如果這個數字在0結束時,我怎樣才能保持零點不被切斷?

f.each_line do |line| 
    if first 
    first = false 
    else 
    a, b, c = line.chop.split(',') 
    # puts a,b,c 
    ay = Base64.decode64(c) 
    ay = ay.unpack('f*') 
    ay.each do |x| 
     temp = ((x * 1000).floor/1000.0) #error occurs here 
     puts temp 
     o.write(temp.to_s + ',') 
    end 
    end 

end 

f.close 
+1

數字不具有尾隨零:尾隨小數0不改變價值。代表它們的文本可能 - Ruby如何讓*格式化數字作爲字符串? (有很多重複的..) – user2864740

回答

1

零不會被「截斷」,它只是沒有顯示在輸出中。如果你想要的精確度一定程度,你需要問它:

o.write(ay.collect { |v| '%.3f' % v }.join(',')) 

這同時處理舍入和演示在一杆。如果你只是想圓你應該使用round功能:

v.round(3) 

請記住,你的內部浮點數字都存儲在二進制,所以沒有這樣的東西作爲2.30。內部可能是2.29999999998371923891,但在呈現爲字符串時會被清理乾淨。

+0

所以我試圖利用這個,但現在我的一些數字四捨五入,我想要的是浮點數直到小數點後第三位。 – Jason

+1

他們必須四捨五入,但他們的方式取決於你。你有沒有與你打交道的各種數字的例子? – tadman

+0

我只需要取出數組中的每個數字並在小數點後第三位將其截斷。有沒有一種方法可以用字符串格式來做到這一點?因爲我不能圍繞這些。 – Jason

0

基於您的評論,如果你想被截斷你的電話號碼(不四捨五入)到小數點後三位,則:

n = 3.14159265358979 
puts "%.3f" % ((n*1000).floor/1000.0) 
#=> 3.141 

這個作用:

n*1000      # 3141.59265358979 
(n*1000).truncate   # 3141 
(n*1000).truncate/1000.0 # 3.141 

然後我用的是"%.3f" formatting以及% method以確保顯示精確的三位小數位(即使其中一些是尾隨零)。

如果你使用這個時候,還是需要一般使用它:

class Numeric 
    def truncate_to(digits=0) 
    factor = 10.0**digits 
    "%.#{digits}f" % ((self*factor).truncate/factor) 
    end 
end 

puts [ 3.14159, 1, -1.9999 ].map{ |n| n.truncate_to(3) } 
#=> 3.141 
#=> 1.000 
#=> -1.999