gpt4 book ai didi

java - Java 中的“实用”双舍入

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:59:20 30 4
gpt4 key购买 nike

所以我已经阅读了很多这方面的内容,所以请知道我知道像 0.6 这样的数字不能绝对准确地表示为 Java double - 但我知道有一个 double 版本表示数字 0.6 足够接近,以至于在对该数字的大多数最终解释中,该数字显示为 0.6 而不是 0.6000000000000001 之类的东西(例如,包括 toString() 或使用像 Jackson 这样的库编码到 JSON - 我的目标)。

我正在寻找一种机制来将 double 值强制转换为一个被解释为相对截断精度的数字。例如,如果我想截断为 0.1 精度,我想要将 0.6975265613 截断为 0.1 精度为 0.6,而不是 0.6000000000000001

因此,基本上可以进行以下测试:

@Test
public void testRounding() {

// prove there is a value that displays cleanly
Double cleanValue = 0.6d;
assertEquals("0.6", cleanValue.toString());

Double value = 0.6975265613d;
Double precision = 0.1d;

value = value / precision;
value = value.longValue() * precision;

// this fails with 0.6000000000000001
assertEquals("0.6", value.toString());

}

我使用 longValue() 来截断速度,但您使用 Math.floor() 得到相同的结果。

查看原始双十六进制值,上面的 cleanValue 是:3fe3333333333333

而四舍五入的结果(值)是:3fe3333333333334

我需要一种能够始终如一地为我提供预期版本(第一个版本)的技术,而不管舍入精度如何 - 假设精度不会超出类型的精度极限。转换为 String 或 BigDecimal 会太慢 - 这是一个分析应用程序,其中这些方法的 x10 成本非常可衡量。

同样,我明白这两个十六进制数字都不是真正代表实际数字 0.6,我只是想让 Java 认为它是 0.6(即 3fe3333333333333):)

谢谢!

最佳答案

这通过了,但不确定它是不是你想要的

@Test
public void testRounding() {

// prove there is a value that displays cleanly
Double cleanValue = 0.6d;
assertEquals("0.6", cleanValue.toString());

Double value = 0.6975265613d;

// get double value truncated to 1 decimal place
value = BigDecimal.valueOf(value).setScale(1,BigDecimal.ROUND_DOWN).doubleValue();

// this fails with 0.6000000000000001
assertEquals("0.6", value.toString());

}

关于java - Java 中的“实用”双舍入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30520208/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com