Java中关于精度损失的问题探究-创新互联

目录

创新互联公司网站建设公司一直秉承“诚信做人,踏实做事”的原则,不欺瞒客户,是我们最起码的底线! 以服务为基础,以质量求生存,以技术求发展,成交一个客户多一个朋友!专注中小微企业官网定制,成都网站制作、成都网站设计,塑造企业网络形象打造互联网企业效应。

一、从一道很有意思的题目出发

二、思考总结


一、从一道很有意思的题目出发

题目:

​假设有“int x=1;”,下列代码中,(C)将导致“可能损失精度,找到int需要char”这样的编译错误。

A. short t=12+'a';

B. char c='a'+1;

C.char m='a'+x;

D.byte n='a'+1;

-----------------------------------------------------------------------------------------------

答案选C。

这是因为,当赋值号右边的表达式中有变量时,编译只检查变量的类型,不检查变量中的值。即使在本题中,x已经被赋值,但它仍然是一个变量,编译器在运算'a'+x的时候,并不检查x的值,只检查x是int类型,并认为'a'+x的结果是int类型(这里说明一下,有多个基本数据运算的时候,如果表达式中的最高精度低于int型整数,则按int精度进行计算。所以即使x是byte类型,x+'a'的结果也依然是int类型),所以会有“可能损失精度,找到int需要char”这样的编译错误。

----------------------------------------------------------------------------------------------------------------------------

上述文字中提到“编译器在运算'a'+x的时候,并不检查x的值,只检查x的类型”,这是因为常量值在编译期确定,而变量值要在运行期确定。

ABD中,值其实在编译期间就可以计算出来,并且计算结果是不会超过范围的。

唯独C却不会在编译期间求值,需要在运行期间计算。
这样的话,编译器无法确知结果是否超出范围,所以要给出一个错误。
你可能会问,x不是1吗,但是x是变量,编译器生成让x=1,再让m='a' + x这样的指令,却不会在编译期间越俎代庖的把值计算出来,计算是留到运行期间的。

---------------------------------------------------------------------------------------------

二、思考总结

那么,为什么变量值要等到运行期确定,而常量值就可以直接在编译期确定呢?

首先,我们要知道:

编译期:检查是否有语法错误,如果没有就将其翻译成字节码文件。即.class文件。
运行期:java虚拟机分配内存,解释执行字节码文件。

对于 

  1. final int a=10;  

  1. final int b=20;  

  1. int c=30;  

  1. int d=40;  

  1. int num1=a+b;  

  1. int num2=c*d; 

java编译时会做一些优化操作。第5行,因为是两个常量做运算,那么他们的结果就是确定的,即num1的值是确定的。所以在编译时,编译器就会直接算出num1的值。第6行则不会,java在运行时期才为变量分配内存空间。

所以,变量值要等到运行期确定是因为java在运行期间才会为变量分配内存。

(若有不对或者需要优化的地方,请大家多多指教)

整理日期:2022--3-25

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


本文标题:Java中关于精度损失的问题探究-创新互联
文章来源:http://pwwzsj.com/article/djegih.html