在Java中应该使用什么数据类型来表示钱?


当前回答

BigDecimal可以使用,为什么不使用Float或Double可以在这里看到:为什么不使用Double或Float来表示货币?

其他回答

我会用Joda Money

它仍然是0.6版本,但看起来很有前途

您可以使用Money and Currency API (JSR 354)。只要向项目添加适当的依赖项,就可以在中使用此API。

对于Java 8,将以下参考实现作为依赖项添加到pom.xml中:

<dependency>
    <groupId>org.javamoney</groupId>
    <artifactId>moneta</artifactId>
    <version>1.0</version>
</dependency>

此依赖项将传递地添加javax。Money:作为依赖项的Money -api。

然后你可以使用API:

package com.example.money;

import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.is;

import java.util.Locale;

import javax.money.Monetary;
import javax.money.MonetaryAmount;
import javax.money.MonetaryRounding;
import javax.money.format.MonetaryAmountFormat;
import javax.money.format.MonetaryFormats;

import org.junit.Test;

public class MoneyTest {

    @Test
    public void testMoneyApi() {
        MonetaryAmount eurAmount1 = Monetary.getDefaultAmountFactory().setNumber(1.1111).setCurrency("EUR").create();
        MonetaryAmount eurAmount2 = Monetary.getDefaultAmountFactory().setNumber(1.1141).setCurrency("EUR").create();

        MonetaryAmount eurAmount3 = eurAmount1.add(eurAmount2);
        assertThat(eurAmount3.toString(), is("EUR 2.2252"));

        MonetaryRounding defaultRounding = Monetary.getDefaultRounding();
        MonetaryAmount eurAmount4 = eurAmount3.with(defaultRounding);
        assertThat(eurAmount4.toString(), is("EUR 2.23"));

        MonetaryAmountFormat germanFormat = MonetaryFormats.getAmountFormat(Locale.GERMAN);
        assertThat(germanFormat.format(eurAmount4), is("EUR 2,23") );
    }
}

BigDecimal可以使用,为什么不使用Float或Double可以在这里看到:为什么不使用Double或Float来表示货币?

表示可能的最小值的整型。换句话说,你的程序应该以美分为单位,而不是美元/欧元。

这应该不会阻止gui将其转换回美元/欧元。

您应该使用BigDecimal来表示货币值。它允许您使用各种舍入模式,并在 金融应用中,舍入模式往往是一个硬性要求 这甚至可能是法律规定的。