2017-11-04 2 views
0

Ich habe keinen vorzeichenlosen long Wert. Alles, was ich tun möchte, es nach einem Punkt des Doppel gesetzt wird (in Dezimaldarstellung), wie folgt aus:Effizientes Setzen von Ganzzahl nach Dezimalpunkt in Java

MyLong = 1024
dotLong = 0,1024

ich es bezogen auf die Menge tun könnte von Ziffern, die ich gescannt habe, während ich einen Scanner schreibe.

private long scanDecDigits() 
{ 
    int digIndex = 0; 
    char ch; 

    while (input.remains()) 
    { 
     ch = input.get(); 

     if (!AS3Char.isDecDigit(ch)) 
      break; 

     // Push up to 10 digits; ignore rest. 
     if (i < 10) 
      numDigits[digIndex++] = ch - '0'; 
    } 

    decBase = Math.pow(10, digIndex); 

    long sub = decBase; 
    long value = 0; 

    for (digIndex = 0; sub != 0; sub /= 10) 
     value += numDigits[digIndex++] * sub; 

    return value; 
} 

Alternativ funktioniert auch dies:

public class Main 
{ 
    public static void main(String[] args) 
    { 
     System.out.println(putInDecimal(255)); 
    } 

    public static double putInDecimal(long lv) 
    { 
     return ((double) lv)/((double) tenPow(lv)); 
    } 

    public static long tenPow(long lv) 
    { 
     return (lv < 10) ? 10 : 
       (lv < 100) ? 100 : 
       (lv < 1e3) ? (long) 1e3 : 
       (lv < 1e4) ? (long) 1e4 : 
       (lv < 1e5) ? (long) 1e5 : 
       (lv < 1e6) ? (long) 1e6 : 
       (lv < 1e7) ? (long) 1e7 : 
       (lv < 1e8) ? (long) 1e8 : 
          (long) 1e9; 
    } 
} 

Tipps.

+2

Sie können 'Math.log10' und' Math.pow' in 'tenPow' anstelle der ternären Operatoren. – Neo

+0

Kompiliert Ihr erster Codeblock überhaupt? Wo sind 'input',' v', 'decBase' usw. definiert? – slider

+0

Einfachere Lösung (wahrscheinlich weniger effizient): 'Double.parseDouble (" 0. "+ Lv)'. –

Antwort

2

Einfachstes und klarste Lösung ist (wie schon gesagt):

return Double.parseDouble("0."+lv); 

Weitere mathematische Lösung:

return lv/Math.pow(10, Math.ceil(Math.log10(lv + 1))); 

Beide arbeiten nur für nicht-negative Werte. Wenn Sie negative Zahlen verwalten müssen, sollte diese Arbeit:

return lv/Math.pow(10, Math.ceil(Math.log10(Math.abs(lv) + 1))); 
+0

_Beide funktionieren nur für positive Werte; _, also bedeutet dies, dass dies nicht für "0" funktioniert? Lass mich sehen ... – Hydro

+0

Sorry, ich hätte für "nicht negative" Werte schreiben sollen. Bearbeiten Sie meinen Beitrag, um das zu reflektieren – Damiano

Verwandte Themen