アップデート:
この投稿では、これまで答えられていなかったと思われる追加の質問が提起されint
ました。これはここで答えられます:long
BigDecimal
double や float を使用して通貨 (または正確な計算が必要な場合) を表現しないのはなぜですか?
float と double は、ほとんどの基数 10 の実数を正確に表すことができないためです。
を使用する場合でも、コンストラクターではなくコンストラクターをBigDecimal
使用する必要があります。String
float
これはすべて言った、あなたの最善の策は次のとおりです。
- すべての値をセントに変換し、として保存します
long
(各ドルの金額に 100 を掛けます)
- セントで操作を行う
- 最後に100で割ってドルに戻す
これにより、必要な精度が維持されます。明らかに、このソリューションは米ドルを念頭に置いているため、外貨への換算には適切な考慮が必要です。
キャストするのではなく、最も近いlong
値に丸めることを検討してください。
double d = 1234.56;
long x = Math.round(d);
double
なぜ a からaに移動したいのか、本当にお尋ねしますlong
。これにより、10 進数値の精度が失われるからです。
ある程度の精度 (たとえば、最大 3 桁) を維持したい場合で、絶対に long でしか作業できない場合は、両方の double に 1,000 を掛けてから、後のすべての操作を同じ係数でスケーリングしてから、それらをスケーリングします。次のように、すべて最後に戻ります。
double starting = 1234.5678;
double worker = starting * 1000;
long roundedWorker = Math.round(worker);
// do other computations here...
// due to earlier scaling, adding 1000 is equivalent to adding 1 to the original
long longResult = roundedWorker + 1000;
double threeDigitPreciseResult = longResult / 1000d;
System.out.println("Adding 1 to original number as a long: " + threeDigitPreciseResult);
アップデート
問題のより良い説明を得た後、あなたが探しているのは によって提供される機能であるように思えますDecimalFormat
。以下は、roundToTwoDecimals()
それを使用する方法と、それを示すテストケースです。
import java.text.DecimalFormat;
import org.junit.Test;
public class ExampleTest {
@Test
public void test() {
double num1 = 29334.32942032432;
double num2 = 438.95940;
double result = num1 / num2;
System.out.println("Before rounding: " + result);
double rounded = roundToTwoDecimals(result);
System.out.println("After rounding: " + rounded);
}
public double roundToTwoDecimals(double d) {
DecimalFormat twoDForm = new DecimalFormat("#.##");
return Double.valueOf(twoDForm.format(d));
}
}
どちらが出力されますか:
Before rounding: 66.82697629968585
After rounding: 66.83