3

卵 12 個の価格が $1.50 の場合、DecimalFormat は、卵 1 個の価格が 0.13 ではなく 0.12 であることを示します。

店に行って 1 つの卵を 12 回購入した場合、1.44 ドルしか支払うことはありません。

しかし、ダースあたりの価格が 1.51 の場合、適切な答えが得られます。

どうやら DecimalFormat は丸めにこのルールを使用しています:

「余りが (>) 5 より大きい場合は切り上げ」

次のルールを使用する必要があります。

「余りが OR EQUAL TO (>=) 5 より大きい場合は切り上げ」

以下は、これを実証するための簡単な Android プロジェクトです。

私が正しい場合、このエラーを Google に報告する手順はどのようなものですか?

package Egg.Price;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import java.text.DecimalFormat;
import java.text.NumberFormat;

public class MyEggPrice extends Activity 
{  double        xPricePerDozen, xPricePerEgg;
   NumberFormat  xMoney = new DecimalFormat("0.00");  
   TextView thePrice;
   String   xString;
      @Override
      public void onCreate(Bundle savedInstanceState) 
      {   super.onCreate(savedInstanceState);
           setContentView(R.layout.main_egg);

           xPricePerDozen   = 1.50; //user would normally enter via an EditText
           xPricePerEgg     = (xPricePerDozen / 12); 
           xString        = xMoney.format(xPricePerEgg); 
           thePrice       = (TextView) findViewById(R.id.the_price);
           thePrice.setText(xString);
        }
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"    android:layout_height="fill_parent"
    >
<TextView   android:text="Price Per Egg"
    android:layout_width="fill_parent"    android:layout_height="30dip" 
    />
<TextView   android:id="@+id/the_price"
    android:layout_width="fill_parent"    android:layout_height=30dip" 
    />
</LinearLayout>
4

2 に答える 2

1

いいえ、あなたは間違っています。デフォルトの丸めモードは HALF_EVEN です。この場合、1.25 は 1.2 に丸められます。1.35 は 1.4 に丸められます。

于 2013-11-10T21:05:02.253 に答える
1

NickT が言うように、HALF-EVEN 丸めは正しく機能しています。DecimalFormat に関する Android ドキュメントには、次のように記載されています。

実際の小数桁数が最大小数桁数を超える場合は、最大小数桁まで半偶数丸めが実行されます。たとえば、小数部の最大桁数が 2 の場合、0.125 は "0.12" としてフォーマットされます。

このように動作することが文書化されているため、バグではありません。

于 2013-11-10T21:15:59.283 に答える