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 + 1
的2**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 中,没有整数类型,而是使用双精度类型(它们称为 Number
s)。如果它们足够大,连续的Number
s 可以是equal to each other。
【讨论】:
以上是关于JAVA :int 转换为bite 以及double 转换为float 视频里解释成字节数不同又是咔嚓砍掉的是啥意思?请高...的主要内容,如果未能解决你的问题,请参考以下文章