JAVA :int 转换为bite 以及double 转换为float 视频里解释成字节数不同又是咔嚓砍掉的是啥意思?请高...

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA :int 转换为bite 以及double 转换为float 视频里解释成字节数不同又是咔嚓砍掉的是啥意思?请高...相关的知识,希望对你有一定的参考价值。

JAVA :int 转换为bite 以及double 转换为float 视频里解释成字节数不同又是咔嚓砍掉的是什么意思?请高手帮忙解释一下…

参考技术A 比如int转byte..
int是4个字节..byte是一个字节..所以int是32位二进制..byte是8位..
假如有个int是2..那么他换成二进制就是00000000....10 转成btye就是切掉前面的..直到剩下8位..所以转过来就是00000010..
参考技术B int是32位的 byte是8为的
00000000000000000000000100000101 = 261
把int转换为byte,这个操作会将int的低8位(从右向左数8位)存到byte类型中于是,byte中就存了
00000101 = 5,double转换成float是精度的截短本回答被提问者采纳
参考技术C 例如byte b=(byte)4 这个就要求你强制的转换 4为int的型,有32位,byte有8位,4为000..00100(一共32位数),那么强制转换的时候就把前面的24位给砍掉剩下00000100 ,但是如果你是double a = 4,那么这个就可以不用转换了,他会自动的转换,double是64为,int是32位,只要在他的前面再补上32位数就可以了 参考技术D 高精度转换成低精度就会被砍掉。
比如.double d = 12.23;
如果你将这个double型的d转换成float就会变成12.2这里就被砍掉了一个0.03

在Java中将int转换为double期间精度会略有变化吗?

【中文标题】在Java中将int转换为double期间精度会略有变化吗?【英文标题】:Does precision change slightly during casting int to double in Java? 【发布时间】:2018-06-06 08:50:10 【问题描述】:

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

因此,有时浮点数的精度可能会因为其表示方式(带有指数和尾数的科学记数法)而改变。

但是如果我将一个整数值转换为double,有没有机会在Java中稍微改变double的精度?

我的意思是,

    int i = 3;
    double d = (double) i;

    System.out.println(d);

如我所料,我得到了3.0 的输出。

但是,由于 Java 中 double 的表示风格,是否有可能像 3.000001 那样改变精度?

【问题讨论】:

【参考方案1】:

int 不能加倍,但你可以 long 加倍(或 int 浮点):

并非所有大于 2^53-1(或小于 -2^53)的 long 都可以用 double 精确表示; 并非所有大于2^24-1(或小于-2^24)的整数都可以用浮点数精确表示。

这个限制是因为用于表示尾数的位数(双精度数为 53,浮点数为 24)。

【讨论】:

@Ben 这样简单的检查可能会产生误导:您可能碰巧选择了Integer.MIN_VALUE 来测试它,您会发现Integer.MIN_VALUE 可以完全表示为浮点数和双精度数。碰巧它适用于Integer.MAX_VALUE “快速检查”方法可以通过始终测试一个数字及其后继来复活。 如果测试范围内存在溢出问题,只能准确表示其中之一。要进行更明确的检查,请尝试以下方式:long num = (long) Math.pow(2,53); System.out.println(num == (long) (double) num); System.out.println((num+1) == (long) (double) (num+1)); System.out.println(num == (long) (double) (num+1)); 只需要一个例外来证明“规则”为假。仅仅因为 Integer.MAX_VALUE 'just' 碰巧起作用并不能证明它不可靠 注意:2^24 和 2^53 是可表示的(float 和 double 都可以),float 中第一个不可表示的整数是 2^24+1,double 中第一个不可表示的整数是 2^ 53+1 你可以做的是检查奇数,如果奇数比所有更小的(接近于零的)奇数也可以表示。【参考方案2】:

您可以在i 上使用iterate,直到找到等于2**i + 12**i 双精度:

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.");
    

它输出:

Loss of precision is greater than 1.0 for 2**53 when using double.

确认接受answer。

请注意,在 Javascript 中,没有整数类型,而是使用双精度类型(它们称为 Numbers)。如果它们足够大,连续的Numbers 可以是equal to each other。

【讨论】:

以上是关于JAVA :int 转换为bite 以及double 转换为float 视频里解释成字节数不同又是咔嚓砍掉的是啥意思?请高...的主要内容,如果未能解决你的问题,请参考以下文章

如何将int转换成double

Java的概述以及语法

两个int数据相除怎么得到double型数据

java 第08节 数据类型转换

java中double类型转换为String类型?

请问double型可以强制转换成int型吗?