Float直接转BigDecimal会导致精度丢失,得先转成String 再转BigDecimal

    @Test
    public void test17() {
        Float f = 12.635f;
        System.out.println(new BigDecimal(f));
        BigDecimal mon = new BigDecimal(Float.toString(f));
        System.out.println(mon);
    }

将 `float` 类型换为 `BigDecimal` 类型时,如果处理不当,可能会出现精度丢失的问题。这是因为 `float` 本身基于 IEEE 754 浮点数标准进行存储,其二进制表示方式无法精确表示某些十进制小数,这种问题在换为 `BigDecimal` 之前就已经存在[^2]。因此,直接使用 `new BigDecimal(float)` 构造函数进行换,可能会导致意想不到的精度误差。 为了避免这一问题,推荐的做法是将 `float` 类型换为 `String` 类型,再使用 `BigDecimal` 的字符串构造方法进行初始化。这种方式能够保留原始浮点数的全部精度,避免由于二进制到十进制的换造成的误差[^3]。 以下是一个示例代码,展示了如何安全地将 `float` 换为 `BigDecimal`: ```java import java.math.BigDecimal; public class FloatToBigDecimal { public static void main(String[] args) { float value = 1.1f; // 不推荐:可能导致精度丢失 BigDecimal bd1 = new BigDecimal(value); System.out.println("float -> BigDecimal:" + bd1); // 推荐:通过 String 换保留精度 BigDecimal bd2 = new BigDecimal(String.valueOf(value)); System.out.println("float -> BigDecimal via String:" + bd2); } } ``` 在上述代码中,`bd1` 的值可能会因为 `float` 类型本身的精度限制而与预期不符,而 `bd2` 则通过使用字符串换的方式保留了原始值的精度[^2]。 此外,如果必须使用 `float` 类型作为 `BigDecimal` 的构造参数,可以通过 `BigDecimal.valueOf(double)` 方法间接实现。该方法内部会将 `float` 类型换为 `double`,再进行字符串换以构造 `BigDecimal`,从而避免精度丢失的问题[^3]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值