在Java中应该使用什么数据类型来表示钱?
当前回答
您可以使用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") );
}
}
其他回答
我会用Joda Money
它仍然是0.6版本,但看起来很有前途
我喜欢使用微型类型,它会像以前的答案所建议的那样包装双精度,BigDecimal或int。(除非出现精度问题,否则我会使用double)。
一个微小的类型给你类型安全,所以你不会混淆双倍的钱与其他双份。
BigDecimal可以使用,为什么不使用Float或Double可以在这里看到:为什么不使用Double或Float来表示货币?
Java有代表ISO 4217货币代码的Currency类。 BigDecimal是表示货币十进制值的最佳类型。
Joda Money提供了一个代表金钱的图书馆。
BigDecimal是用于货币的最佳数据类型。
货币有很多容器,但它们都使用BigDecimal作为底层数据类型。使用BigDecimal不会出错,可能会使用BigDecimal。ROUND_HALF_EVEN舍入。
推荐文章
- 我如何修复一个NoSuchMethodError?
- Maven surefire找不到ForkedBooter类
- Java 8:我如何在流中使用异常抛出方法?
- 去下一次迭代在java For循环
- 在Java中使用什么数据类型来表示钱?
- Class.getResource()和ClassLoader.getResource()之间的区别是什么?
- 如何通过传递特定日期来确定星期几?
- 如何将DecimalFormat的小数分隔符从逗号更改为点/点?
- 控制jar工件的Maven最终名称
- Spring-MVC控制器中的404触发器?
- 为什么生成较长的serialVersionUID而不是简单的1L?
- JAX-RS / Jersey如何自定义错误处理?
- 在执行JpaTest时无法找到@SpringBootConfiguration
- _JAVA_OPTIONS, JAVA_TOOL_OPTIONS和JAVA_OPTS之间的区别
- 在java中转换字符到ASCII数字值