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

Java单元测试因数值小数点与逗号格式不匹配断言失败如何解决?

问题原因
  • 类型不匹配:你调用Assertions.assertEquals时传入的第一个参数是double类型的17.41,第二个参数是String.format返回的字符串,类型不同本身就会触发断言失败。
  • 本地化配置问题:String.format默认使用JVM当前环境的默认Locale,俄语区等欧洲地区的Locale默认用逗号作为小数分隔符,所以格式化结果为17,41,和预期的点分隔格式不符。
修复方案

方案1:直接比较浮点数值(推荐)

浮点数比较直接使用JUnit自带的带误差范围的重载方法即可,不需要处理字符串格式化逻辑,稳定性更高:

@Test
@DisplayName("Проверка проверка правильности рассчета")
void calculationCheck () throws Exception {
    TriangleSquareCalculator result2 = new TriangleSquareCalculator();
    // 第三个参数为允许的浮点误差,保留两位小数的场景下设置0.01即可满足需求
    Assertions.assertEquals(17.41, result2.getTriangleSquare(7,5,9), 0.01);
}

方案2:指定Locale格式化后比较字符串

如果你需要校验格式化后的输出格式,显式指定使用点作为小数分隔符的Locale即可:

import java.util.Locale;

@Test
@DisplayName("Проверка проверка правильности рассчета")
void calculationCheck () throws Exception {
    TriangleSquareCalculator result2 = new TriangleSquareCalculator();
    // 显式指定Locale为US,保证小数分隔符为点
    String formattedResult = String.format(Locale.US, "%.2f", result2.getTriangleSquare(7,5,9));
    // 注意预期值要使用字符串类型,不要用double类型的17.41
    Assertions.assertEquals("17.41", formattedResult);
}
代码优化提示

原有边长校验逻辑存在漏洞:if ((a | b | c) <= 0)无法正确拦截单边长为0的情况,建议修改为逻辑更清晰的if (a <= 0 || b <= 0 || c <= 0),避免校验遗漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:24:04