You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断double类型数值是否为另一double类型数值的倍数?

解决浮点数倍数判断的精度问题

问题出在浮点数的二进制存储精度限制:像2.4、0.2这类十进制小数,在二进制里是无限循环的,计算机存储时只能取近似值,导致x % y的结果并不是精确的0,所以直接和0比较会返回false。

给你几个可行的解决方法:

方法一:转换为整数计算

把浮点数放大为整数,避开精度问题。比如这里两个数都是一位小数,乘以10转成整数后再取模:

double x = 2.4;
double y = 0.2;
// 转成整数后判断
if ((int)(x * 10) % (int)(y * 10) == 0) {
    System.out.println("是倍数");
} else {
    System.out.println("不是倍数");
}

注意:如果小数位数不固定,要先确定最大的小数位数,再乘以对应倍数(比如两位小数乘100),避免转换时丢失精度。

方法二:比较误差范围

判断取模结果的绝对值是否小于一个极小的阈值(比如1e-9),因为浮点数误差通常很小,只要结果接近0就认为是倍数:

double x = 2.4;
double y = 0.2;
double remainder = x % y;
if (Math.abs(remainder) < 1e-9) {
    System.out.println("是倍数");
} else {
    System.out.println("不是倍数");
}

这个方法适合大多数浮点数判断场景,阈值可以根据需求调整。

方法三:用BigDecimal精确计算

如果需要绝对精确的结果,使用BigDecimal类来处理,它能避免浮点数的精度丢失:

import java.math.BigDecimal;

public class Main {
    public static void main(String[] args) {
        BigDecimal xBig = new BigDecimal("2.4");
        BigDecimal yBig = new BigDecimal("0.2");
        BigDecimal remainder = xBig.remainder(yBig);
        if (remainder.compareTo(BigDecimal.ZERO) == 0) {
            System.out.println("是倍数");
        } else {
            System.out.println("不是倍数");
        }
    }
}

注意:创建BigDecimal时要传入字符串形式的数值,不要直接传double,否则还是会带精度问题。

内容的提问来源于stack exchange,提问作者Abhinav Raja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 02:52:01