web-dev-qa-db-ja.com

Androidで浮動小数点数を丸める方法

以下のシナリオで行き詰まっています。

Xが1.5以下の場合、最終結果はx = 1になります。xが1.5より大きい場合、x = 2になります。

入力数はx/100になります。

たとえば、input = 0.015 => x = 1.5 => display x = 1。

私が得た問題は、浮動小数点数が不正確であるということです。たとえば、input = 0.015ですが、実際には0.01500000000000002のようになります。この場合、xは1.500000000000002であり、1.5よりも大きい=>ディスプレイ出力はx = 2です。

ランダムに発生するため、解決方法がわかりません。 0.5と同様に、1.5でも正しい結果が得られます。しかし、2.5、3.5、4.5、5.5では間違った結果が返されます。その後、6.5は再び正しい結果を返します。

私が実装したコードは以下の通りです:

float x = 0.015;
NumberFormat nf = DecimalFormat.getPercentInstance();
nf.setMaximumFractionDigits(0);
output = nf.format(x);

したがって、xに依存し、出力は正しいか間違っている可能性があります。それはとてもランダムです。

Math.round、Math.floor、Math.ceilsを使用しようとしましたが、浮動小数点数は予測不可能であるため、どれも動作しないようです。

解決策について何か提案はありますか?

前もって感謝します。

8
Long Dao

これが私の古いコードゴルフの答えです。

public class Main {

    public static void main(String[] args) {
        System.out.println(math(1.5f));
        System.out.println(math(1.500001f));
        System.out.println(math(1.49999f));
    }

    public static int math(float f) {
        int c = (int) ((f) + 0.5f);
        float n = f + 0.5f;
        return (n - c) % 2 == 0 ? (int) f : c;
    }

}

出力:

1
2
1
4
Enzokie

String.format

String s = String.format("%.2f", 1.2975118);
4
MurugananthamS

float値fを小数点以下2桁に丸める。

String s = String.format("%.2f", f);

Stringfloatに変換するには...

float number = Float.valueOf(s)

floatintに丸めたい場合は、達成したい結果に応じて、floatをintにダウンキャストするさまざまな方法があります。

丸め(指定された浮動小数点に最も近い整数)

int i = Math.round(f);

f = 2.0-> i = 2; f = 2.22-> i = 2; f = 2.68-> i = 3
f = -2.0-> i = -2; f = -2.22-> i = -2; f = -2.68-> i = -3

3
user392117

私は同じ問題に直面していました、DecimalFormatを使用しました。これは役立つかもしれません。

float x = 1.500000000000002f;
DecimalFormat df = new DecimalFormat("###.######");
long l = df.format(x);
System.out.println("Value of l:"+l);
0
Archana

私は簡単な答えが好きです

Math.round(1.6); // Output:- 2
Math.round(1.5); // Output:- 2
Math.round(1.4); // Output:- 1
0
Rishi Swethan