2009-02-25 63 views
2

如何獲得餾分長度?如果可能的話,不使用字符串操作或循環餾分長度

should all return length of 3: 
5.234 
5.23400 
5.234000 

任何編程語言被接受

[編輯]

不是家庭作業,我想在其最小顯示量餾分。例如,我在數據庫中定義了數字(18,8)。如果用戶只輸入5.234,則保存在數據庫中的數據是5.23400000。我只想顯示它早在5.234僅

+0

這是功課嗎? – 2009-02-25 09:08:26

回答

2
If Int(num) = num Then Return 0 
num *= 10 
If Int(num) = num Then Return 1 
num *= 10 
If Int(num) = num Then Return 2 
num *= 10 
If Int(num) = num Then Return 3 
num *= 10 
If Int(num) = num Then Return 4 
num *= 10 
If Int(num) = num Then Return 5 
num *= 10 
If Int(num) = num Then Return 6 
num *= 10 
If Int(num) = num Then Return 7 
num *= 10 
If Int(num) = num Then Return 8 
Throw New Exception("Number exceeds expected precision") 

沒有字符串操作,沒有循環。

編輯:

BTW,有一個循環做到這一點:

result = 0 
Do While (Int(num) !> num) 
    num *= 10 
    result += 1 
Loop 
Return result 

稍微更優雅

+0

這個很好。我即將解決重複分割問題(​​我放棄了無環路的解決方案)並計算'直到0,但不能這樣做,因爲分數是我所追求的,而不是整數。這是一個很好的邏輯! – Hao 2009-02-26 01:35:18

0

對於非小數部分,長度是:

int((ln(v)/ln(10))+.999) 

只要V> 1式中,Ln()是自然對數和INT()總是舍入。對於v == 1,ln(v)返回0,所以你必須在特殊情況下處理這個。

它應該有可能實現小數部分相同的事情(v - int(v)),但我的數學失敗了我。

+0

我懷疑與自然日誌有關的任何事情都可能是有價值的。因爲String.format(「%x」,Double.doubleToRawLongBits(5.234))產生4014ef9db22d0e56,並且這個保留所有數字,估計爲5.2339999999999999857891452847979962825775146484375,而5.25可以精確表示。再次通過5.25100000000000033395508580724708735942840576171875近似5.251。我的觀點是長度在分數情況下不是單調的。 – 2012-07-02 22:46:14

0

只需實施除法算法。 當數字> 7或8位數字(用於float32)時停止,並且您停止

3

考慮到您關心顯示而不是內部表示,爲什麼不去掉尾部0?

#!/use/bin/perl 

my @nums = ('5.234', '5.23400', '5.234000'); 
$_ =~ s/0+$// for @nums; # remove trailing 0s 
$_ =~ s/\.$// for @nums; # remove trailing . 

print "@nums\n"; 

你也許可以優化成一個單一的正則表達式。

+0

實際上,5.234不能用IEEE 745的64位整數表示,實際上它大約爲5。233999999999999985789145284797996282577514648437500 ;-) – 2012-07-02 22:38:31

0

使用Java和JDBC時,通過ResultSet.getBigDecimal()獲取值。要獲得正確的比例,使用此代碼(Java 5中和了;還有就是在Java 1.4中的一個錯誤,這使得它失敗「0.0」):

int precision = v.stripTrailingZeros().scale(); 

對於Java 1.4,見this page

0

在Java:

Double.valueOf("5.34000").toString(); 

我想,你可能無論如何都想將字符串轉換爲double。