2013-11-10 50 views
3

標題幾乎說這一切...float的字符串表示的最大可能長度是多少?

我試圖強制在窗體上的文本輸入的最大長度。其中一個字段可以是任何有效的浮點數。它的最大長度是多少?

例如,對於一個整數

// negative sign makes MIN_VALUE larger than MAX_VALUE 
String.valueOf(Integer.MIN_VALUE).length(); 

UPDATE

我已經測試了以下內容:

String.valueOf(-Float.MIN_VALUE).length(); 
String.valueOf(-Float.MAX_VALUE).length(); 
String.valueOf(Float.MIN_VALUE).length(); 
String.valueOf(Float.MAX_VALUE).length(); 

這給了我下面的輸出:

8 
13 
7 
12 

我不相信13是最大長度

+0

爲什麼要檢查浮點數的字符串表示形式的字符數?爲什麼你不能直接使用float? – Lokesh

+2

['-Float.MAX_VALUE'](http://docs.oracle.com/javase/7/docs/api/java/lang/Float.html#MAX_VALUE)? – Maroun

+0

@Lokesh說實話,我不需要**這個。我目前只是使用'Float.valueOf(field.getText())'來獲取該字段的輸入,並且工作正常。但是我所有的其他領域都被限制在一個最大長度,所以我希望能爲這個領域做同樣的事情。 – firyice

回答

4

浮點值的最大長度沒有意義。

如果你希望用戶輸入要允許任何浮點值在Java表示的一樣

1000000000000000000000000000000000000000000000000000000000000000 

甚至

000000000000000000000000000000000000000000000000000000000.00000000000000000000001 

限制輸入框的,應根據企業的事情不需要上規則「我對所有其他領域有限制」。

這裏的「生意」規則到目前爲止似乎是「可以被解析並存儲到一個浮動」

還要注意的是限制輸入長度往往防止輸入(通過剪切&粘貼)的東西,它是長度並且只有在編輯後才能成爲有效的輸入。所以它實際上降低了可用性。

+0

謝謝你幫我認識到我早上3點思考過程中的錯誤。 – firyice

1

可以通過簡單地測試隨機值直到找到穩定的最大值來提供反例。這種方法可能存在的一個問題是隻能找到局部最大值,並且沒有詳盡的全局最大值。

這臺電腦上的結果是:

Max. float length: 15 (-1.09045365E-32) 

這是一個反例到您-Float.MAX_VALUE

有時知道什麼最大長度是Float.toString()是有用的,在這種情況下,可以回答這個問題。

public class FindMaxStringForPrimitive { 

    private static final int MAX_PERIOD = 10000; // Number of iterations before 
               // concluding answer 

    public static void main(String... args) { 
    maxFloatLength(); 
    } 

    private static void maxFloatLength() { 
    final class Test { 
     int r = Integer.MIN_VALUE; 
     Random rnd = new Random(); 
     String max = ""; 

     boolean fit() { 
     return fit(Float.intBitsToFloat(rnd.nextInt())); 
     } 

     boolean fit(float value) { 
     String x = Float.toString(value); 
     if (x.length() > r) { 
      r = x.length(); 
      max = x; 
      return true; 
     } 
     return false; 
     } 
    } 
    Test test = new Test(); 
    int i = 0; 
    test.fit(Float.MAX_VALUE); 
    test.fit(-Float.MAX_VALUE); 
    test.fit(Float.MIN_VALUE); 
    test.fit(-Float.MIN_VALUE); 
    test.fit(Float.NaN); 
    test.fit(Float.POSITIVE_INFINITY); 
    test.fit(Float.NEGATIVE_INFINITY); 
    while (i < MAX_PERIOD) 
     if (test.fit()) i = 0; 
     else 
     i++; 
    System.out.println("Max. float length: " + test.r + " (" + test.max + ")"); 
    } 

} 
相關問題