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

如何在不丢失小数部分的情况下将十进制字符串转为Java Integer类型

解决方案:将十进制字符串转成Integer并保留小数部分

由于无法修改Integer字段,核心思路是把小数数值放大为整数存储(比如两位小数就乘以100),后续需要展示时再还原为小数格式。以下是两种可靠实现方式:

方法一:使用BigDecimal处理(推荐,避免浮点精度问题)

BigDecimal能精准处理十进制运算,适合需要四舍五入或确保精度的场景:

import java.math.BigDecimal;
import java.math.RoundingMode;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class NumberFormatTest {
    private static final Logger log = LoggerFactory.getLogger(NumberFormatTest.class);

    @Test
    public void testDecimalToInteger() {
        String stringValue = "3.33";
        
        // 解析字符串为BigDecimal
        BigDecimal decimalValue = new BigDecimal(stringValue);
        // 保留两位小数(四舍五入)后乘以100,转为整数
        BigDecimal scaledValue = decimalValue.setScale(2, RoundingMode.HALF_UP)
                                            .multiply(new BigDecimal(100));
        // 转为Integer(若数值超出Integer范围,需改用long或捕获异常)
        int storedValue = scaledValue.intValueExact();
        
        log.info("存储的Integer值: {}", storedValue); // 输出333
        // 还原为原小数格式展示
        log.info("还原后的小数: {:.2f}", storedValue / 100.0); // 输出3.33
    }
}

方法二:字符串分割处理(适合固定两位小数的场景)

如果确定输入字符串都是两位小数,可直接分割拼接:

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class NumberFormatTest {
    private static final Logger log = LoggerFactory.getLogger(NumberFormatTest.class);

    @Test
    public void testStringSplitToInteger() {
        String stringValue = "33.44";
        
        // 按小数点分割字符串
        String[] parts = stringValue.split("\\.");
        String integerPart = parts[0];
        // 处理小数部分:不足两位补0,超过两位截断
        String decimalPart = parts.length > 1 ? parts[1] : "00";
        decimalPart = decimalPart.length() > 2 ? decimalPart.substring(0, 2) 
                                               : String.format("%-2s", decimalPart).replace(' ', '0');
        
        // 拼接整数部分和小数部分,转为Integer
        int storedValue = Integer.parseInt(integerPart + decimalPart);
        
        log.info("存储的Integer值: {}", storedValue); // 输出3344
        // 还原为原小数格式展示
        log.info("还原后的小数: {:.2f}", storedValue / 100.0); // 输出33.44
    }
}

注意事项

  • Integer范围限制:Integer的取值范围是-2147483648到2147483647,如果原字符串乘以100后超出这个范围,会抛出ArithmeticException(使用intValueExact()时)或溢出(使用intValue()时),需提前确认数值范围。
  • 精度处理:如果输入小数位数不固定,建议用BigDecimal的方式控制舍入规则(如RoundingMode.DOWN截断、RoundingMode.HALF_UP四舍五入)。

内容的提问来源于stack exchange,提问作者Hari Sheen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:45:37