在Java中有效地将小数点后的整数放入

时间:2017-11-04 16:03:19

标签: java floating-point

我有任何未签名的long值。我想要做的就是将它放在双点(十进制表示)之后,如下所示:

  

myLong = 1024
  dotLong = 0.1024

我可以根据我扫描的数字量来编写扫描仪。

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;
}

或者,这也有效:

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;
    }
}

提示。

1 个答案:

答案 0 :(得分:2)

最简单,最清晰的解决方案(如前所述):

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

更多数学解决方案:

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

两者仅适用于非负值。如果您需要管理负数,这应该有效:

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