文章目录结论两个int变量除法结果的精度问题Java其他基本类型的运算规则数值记忆规则的扩展
结论
不能将两个int变量直接除法。 会失去精度。
推荐:将任一int变量类型强制转换为小数即可。
两个int变量除法结果的精度问题代码如下:
如果public class test { publicstaticvoidmain (string [ ] args )//的两个操作数都是int变量,则运算结果也为intsystem.out.println )/2 ); //2 //将任一操作数转换为浮点数将导致int和double运算,结果也将变为double。 system.out.println(5/2.0; //2.5system.out.println(5.0/2 ); //2.5 //模拟int/int int a=5; int b=2; int result=a/b; system.out.println(result ); //2 }}两种int类型的加减、乘法没有问题。 但是除法:
两个int进行除法运算,结果保持int类型。
因此,如5/2所示,结果为2.5,小数部分仍被省略(int仅用于存储整数,没有存储浮点数的机制)。
问题延长的季节很少。
当多个运算分层嵌套时,最内层的运算一般不用四舍五入,而是用分数表示。
执行运算到最外层,然后四舍五入到最终的运算结果,可以减少误差。
Java其他基本类型的运算规则数字存储规则4种整数: byte、short、int、long
两种小数: float,double
如果在代码中写入整数数字常量(如123 ),则该类型缺省为int。
要将整数常量类型指定为long,必须使用l或l后缀。 例如:
//long a1=12345678901111; //错误:太大整数long a2=12345678901111L; 如果写小数,则类型默认为双精度。
要将小数字常量类型指定为浮点,请使用后缀f或f。 例如:
//float f1=2.34; //错误:不兼容的类型:从双精度转换为浮点可能会丢失浮点F2=2.34 f; 那么,在不同类型的变量之间进行运算,运算结果的类型怎么样?
整数之间
byte、short、int这三种整数间运算的结果都是int型。
证明:短a=1; 短b=2; //short c=a b; //错误:不兼容的类型:在从int转换为short时可能会丢失。 两个整数常数的运算结果,默认为int型。
long的范围比int大。
long参加其他三个整数类型和运算,结果为long。向上提升(范围)
提高范围是为了拥有足够多的空间存储结果的数据。
小数之间请不要测试。 已知。
浮点数类型默认为双精度
结果的存储范围提高了。
那么,如下。
浮点和浮点、浮点和双精度、双精度和双精度之间的运算最终为双精度。
整数和小数的混合小数也称为浮点数,在计算机中的存储很复杂,有三个部分: SEM。
S sign码位
E exponent指数位
m
详情百度关键词计算机浮点数存储机构。
总之有两点:
-计算机中不能存储完全无理数。 所谓存储,是指浮点数全部为确定精度范围内的近似值
-浮点数存储,需要比整数更多的空间。
注意第2点:浮点数比整数使用更多的存储空间
基于以前的:两个数值常数运算,结果保证范围足够大,为向上提升范围。
那么,如下。
当一个整数和一个浮点数运算,其结果必然为浮点数。
这也是5/2的结果是2
5/2.0的结果是2.5的原因。
在应用方面,要特别注意一些基本方法(计算模块)的实现层代码。
如果有两个int变量进行除法计算,一定对其中一个int进行类型的强制转换。
例如:
//a,b是两个int类型的参数int a=5; int b=2; //double result=a/b; //错误doubleresult=a//(double ) b ); //如果不将任何运算数强制转换为类型,运算的早期会失去精度,从而产生蝴蝶效应。
扩展JavaScript是弱类型语言,使用var (或let,const )声明变量。 在JS中,5/2的结果一定是2.5。 因为JS的数值都是64位浮点数。
那么,JS其实存整数是浪费空间。
但是,在JS中,数值运算其实有更大的精度问题。 不仅仅是数值运算。 例如:
3.5 - 3.40.10000000000000009这是因为JS作者Brendan Eich在实现JS时太短(10天),所以语言设计的一些缺陷|特色:
了不起的笑容: