12

さて、これが私の問題です。基本的に私はこの問題を抱えています。

.53999999 のような番号があります。数学関数を使用せずに 54 に切り上げるにはどうすればよいですか?

スケーリングするには100を掛けてから割る必要があると思いますか?そんな感じ?


問題はお金です。$50.5399999 を持っているとしましょう。$50 を手に入れる方法は知っていますが、セントを手に入れる方法はわかりません。.539999 の部分を取得できますが、54 セントにする方法がわかりません。

4

10 に答える 10

20

私は次のようなものを使用します:

BigDecimal result = new BigDecimal("50.5399999").setScale(2, BigDecimal.ROUND_HALF_UP);

Make cents with BigDecimal on JavaWorldという素晴らしい記事がありますので、ぜひご覧ください。

于 2009-02-07T01:19:19.103 に答える
16

お金を表すには、浮動小数点ではなく、10 進数または通貨型を使用する必要があります。

于 2009-02-07T01:16:30.140 に答える
7

50.54 が倍精度で表現できない場合、丸めは役に立ちません。

50.53999999 を整数のドルと整数のセントに変換しようとしている場合は、次のようにします。

double d = 50.539999; // or however many 9's, it doesn't matter
int dollars = (int)d;
double frac = d - dollars;
int cents = (int)((frac * 100) + 0.5);

最後のステップでの 0.5 の追加は、セントの最も近い整数に丸められることに注意してください。常に切り上げたい場合は、0.5 の代わりに 0.9999999 を追加するように変更します。

于 2009-02-07T01:30:38.863 に答える
6

数学関数を使用したくないのはなぜですか?

static long round(double a) 

-引数に最も近い long を返します。

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html

お金を表すために、車輪を再発明する代わりに、次のアドバイスを使用します。

http://www.javapractices.com/topic/TopicAction.do?Id=13

于 2009-02-07T01:07:50.250 に答える
3

long を使用して、通貨をセント数として保存してみてください (これを基本通貨単位の数に抽象化できます)。

編集:これは宿題なので、タイプを制御できない場合があります。これを将来のプロジェクトの教訓と考えてください

long money = 5054;

long cents = money % 100;
long dollars = money / 100; // this works due to integer/long truncation

System.out.printf("$%d.%02.d", dollars, cents);
于 2009-02-19T21:07:36.713 に答える
1

.535 という数値を作成し、それを元の数値と比較して、切り上げるか切り下げるかを確認する必要があります。.53999999 か​​ら .535 を取得する方法は次のとおりです (任意の数値で機能するはずです)。

num = .53999999;
int_num = (int)(num * 100); // cast to integer, however you do it in Java
compare_num = (int_num + 0.5) / 100;

compare_numこの場合、.535 になります。numが より大きいか等しい場合はcompare_num、 に切り上げint_num + 1ます。それ以外の場合は、単純に に切り捨てますint_num

于 2009-02-07T01:24:45.647 に答える
0

ショーンはそれを持っているようですが、適切なルールを課したい場合は、次のように if ステートメントを挿入することをお勧めします。

double value = .539999;
int result = (int) (value*100);
if(((value*100)%result)>.5)
    result++;
于 2009-02-07T01:16:58.283 に答える
0

double 値の丸めには long を使用することをお勧めします。数が少ない場合は問題ありませんが、違いが生じる可能性があります。

double d = 50.539999;
long cents = (long)(d * 100 + 0.5);
double rounded = cents/100;
于 2009-02-07T09:17:31.697 に答える
-1

正確に何をしようとしていますか?あなたは常に二桁に行こうとしていますか?それとも、何があっても最後に 99999 のようなものを常に修正しようとしていますか?

コメントによると、それは実際には前者であり、ドルとセントに丸められます。ですから、まさにround(100*a)/100あなたが望むものです。(後者はもっと複雑になる...)

最後に、セントの部分だけを抽出したい場合は、次のようにします。

dollars_and_cents = round(100*a)/100
cents = (dollars_and_cents-(int)dollars_and_cents)*100

(または、java は単にfrac? の場合、最後の行はfrac(dollars_and_cents)*100.

于 2009-02-07T01:10:25.300 に答える