首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在int浇铸过程中,精度是否在Java中略有变化?

在int浇铸过程中,精度是否在Java中略有变化?
EN

Stack Overflow用户
提问于 2018-06-06 08:50:10
回答 2查看 2.4K关注 0票数 25

我读过这个- Why Are Floating Point Numbers Inaccurate?

因此,有时由于浮点数的表示方式(用指数和尾数表示科学表示法),可以改变浮点数的精度。

但是,如果我将整数值转换为double,那么在Java中是否有可能稍微更改double的精度呢?

我是说,

代码语言:javascript
复制
    int i = 3;
    double d = (double) i;

    System.out.println(d);

我得到的3.0输出和我预期的一样。

但是,是否有可能因为Java的表示风格而像3.000001一样改变精度呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-06 08:53:10

不适用于int到double,但您可以长到双倍(或int用于浮动):

  • 并不是所有大于2^53-1 (或小于-2^53)的长都可以精确地用双倍表示;
  • 并不是所有大于2^24-1 (或小于-2^24)的ints都可以精确地用浮点表示。

这种限制的产生是因为用于表示尾数的位数(53倍,24浮点数)。

票数 33
EN

Stack Overflow用户

发布于 2018-06-06 11:52:43

您可以在iterate之上使用i,直到您找到一个等于2**i + 12**i

代码语言:javascript
复制
import java.util.stream.IntStream;

public class PrecisionLoss
{
    public static void main(String[] args) {
        double epsilon = 1;
        Integer maxInt = IntStream.iterate(0, i -> i + 1)
                .filter(i -> Math.pow(2, i) == Math.pow(2, i) + epsilon)
                .findFirst().getAsInt();
        System.out.println("Loss of precision is greater than " + epsilon
                + " for 2**" + maxInt + " when using double.");
    }
}

它的产出如下:

代码语言:javascript
复制
Loss of precision is greater than 1.0 for 2**53 when using double.

这证实了接受的answer

注意,在Javascript中,不存在整数类型,而是使用了双值(它们被称为Numbers)。如果它们足够大,则连续的Numbers可以是equal to each other

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50716066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档