我有以下Java代码;

BigDecimal price; // assigned elsewhere

if (price.compareTo(new BigDecimal("0.00")) == 0) {
    return true;
}

写if条件的最好方法是什么?

推荐答案

使用compareTo(BigDecimal.ZERO)而不是equals():

if (price.compareTo(BigDecimal.ZERO) == 0) // see below

BigDecimal常数相比,BigDecimal.ZERO避免了每次执行都必须构造new BigDecimal(0).

为方便起见,BigDecimal还有常数BigDecimal.ONEBigDecimal.TEN.


笔记

不能使用BigDecimal#equals()的原因是它考虑了scale:

new BigDecimal("0").equals(BigDecimal.ZERO) // true
new BigDecimal("0.00").equals(BigDecimal.ZERO) // false!

所以它不适合纯粹的数字比较.但是,BigDecimal.compareTo()在比较时不考虑比例:

new BigDecimal("0").compareTo(BigDecimal.ZERO) == 0 // true
new BigDecimal("0.00").compareTo(BigDecimal.ZERO) == 0 // true

Java相关问答推荐

将linkedHashMap扩展到Java中的POJO类

Spring Batch 5-不要让它在数据库中自动创建表

上下文初始化期间遇到异常-使用Java配置配置HibernateTemplate Bean时

为什么在枚举中分支预测比函数调用快?

无法处理批处理侦听器中的反序列化异常

JavaFX Maven Assembly插件一直打包到错误的JDK版本

所有 case 一起输入时输出错误,而单独放置时输出正确

与Spring Boot相关的实体未正确保存

在Java 17中使用两个十进制数字分析时间时出错,但在Java 8中成功

搜索列表返回多个频道

Java页面筛选器问题

如何使这两种方法合二为一?

如何在运行docker的应用程序中获取指定的配置文件

org.springframework.web.HttpRequestMethodNotSupportedException:请求方法';帖子';不支持

由于版本不匹配,从Java 8迁移到Java 17和Spring 6 JUnit4失败

Eureka客户端无法使用用户/通行证注册到Eureka服务器

如何在更改分辨率时将鼠标坐标计算为世界坐标

在不带instanceof或switch的java中记录模式

Java-Apache BufferedHttpEntity 在发送请求时加载整个文件

仅允许使用 Spring Boot 3 从本地主机