关于java的精度损失问题

问题描述

关于java的精度损失问题 5C
大家好,我是java初学者,对于精度损失还是不太清楚。我们知道对于表数范围:byteshortintlongfloatdouble依次增大,所以以下代码应该会报错精度损失:
byte a =1;
byte b =2;
byte i = a +b;
但是,为什么下面这个编译时不报错?
float a = 1.2f;
float b = 2;
float i = a + b;
究竟为什么?等号右自动转换成double赋值给float不会损失精度???
大神在哪里?

解决方案

 byte i = a +b;//java中,虽然ab都是byte类型,但a+b这种形式的加法,a+b在做加法前都会转换成int类型,所有a+b的结果是int型,int到byte会精度丢失,需要强转(byte)(a+b) float i = a + b;//这里ab都是float,两个float数值相加不需要转换类型,不是你说的先转换成double

解决方案二:
能不能编译和精度损失无关,和是否有隐式的类型转换有关。

float b = 2;
相当于 float b = (float)2;

所以此时b已经是浮点了。

解决方案三:
等号右边相加的结果,不是double,是float所以不会有经度损失。
float a = 1.2f; //1行
float b = 2; //2行

float i = a + b; //3行
小数默认是double型,但是1行你指定了是float型(1.2f),2行是一个int,所以3行右边的结果,是float,不是double,所以不会经度损失。
如果,1行不加f,编译会报错(小数默认是double型)。

解决方案四:
byte a =1;这里有一个隐含的转型,就是说如果后面是一个常数的话,会隐含转型为byte(当然得在byte范围之内,否则也会出错)
byte i = a +b;这里会有一个隐含的类型拓展问题,也就是说会将ab提升为int然后参与运算,索引必须强制类型转换

float a = 1.2f;//必须加f因为默认是double,而double转float会丢失精度
float b = 2;//int转float,而且是一个常数,可以隐式转型为float,
float i = a + b;//隐含转型为最高的,然后进行运算,默认最低是int类型。两者都是float,不会出现double的,所以是可以的,

解决方案五:
首先,你第二浮点型的b是一个2,他与float型进行运算,结果为float,但如果是2.0那么就肯定是double了(损失精度),第一个byte型的,会报精度损失
public class QTest_4 {

public static void main(String[] args) {    byte a =1;    byte b =2;    show(a+b);    float c = 1.2f;    float d = 2;    show(c+d);    //因此在运算过程中,有些会自动转换成别的类型,    //但你第二个最高是float,所以,就是float}public static void show(int a){    System.out.println(""int型重载"");}public static void show(byte a){    System.out.println(""byte型重载"");}public static void show(float a){    System.out.println(""float型重载"");}public static void show(double a){    System.out.println(""double型重载"");}

}

解决方案六:
默认的精度类型导致的
byte i= a+b 中,a+b 后默认的类型 为int类型 所以会损失精度
float i=a+b 中,两边都是 float ,所以不会出错

解决方案七:
float i = a+b;不会报错?明明已经精度损失了啊??大范围赋值给小范围?

a和b都是float类型,并且a+b的和并没有超出float类型的范围和精度

解决方案八:
java double 精度损失问题
java精度问题_20120514
java 精度问题

时间: 2024-09-03 21:00:15

关于java的精度损失问题的相关文章

java操作Excel处理数字类型的精度损失问题验证

java操作Excel处理数字类型的精度损失问题验证: 场景: CELL_TYPE_NUMERIC-->CELL_TYPE_STRING--->CELL_TYPE_NUMERIC POI版本:poi-3.10.1poi-3.9 Code: package poi; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.i

c++-C++ double变量的精度损失问题!!!

问题描述 C++ double变量的精度损失问题!!! 使用如下语句输出 cout.setf(ios::fixed); cout<<setprecision(3)<<14.5*0.01;//此时输出为0.145: cout<<setprecision(2)<<14.5*0.01;//此时输出是0.14,按照四舍五入此时应该输出的是0.15啊!!!调试变量观察14.5*0.01 double型的值为0.149999999999999999999999,但是如果

sqlite3-C#读取SQLite3数据库中以科学计数法存的数据,精度损失

问题描述 C#读取SQLite3数据库中以科学计数法存的数据,精度损失 我使用的是C#语言,.net 2.0,SQLite3中有一条数为 9.13253416969279E-29 读取方式为: SQLiteCommand command = new SQLiteCommand(strSql, m_Connection); return command.ExecuteScalar(); 返回一个object对象, 值为 0.0000000000000000000000000001M 我想取到数据库

Java中高精度问题的bigdecimal解决方式

最近有空写了点老的J2EE的代码,发现有一个十分有意思的问题,当用Hibernate从数据库里把浮点数读取出来的时候做一些比如累加的工作,例如 summary 或者递减之类的,就会发现在最后的结果中会出现些许问题. 如:3.41+5.2+56.2+23.3+... (这类两位小数的价钱),结果会出现103.00000000000001这种结果,但是人算的话反而会得出正常的数据.看样子double,float这类数据精度上来了还会有这类问题.     于是,翻了点资料,在有的编程语言中提供了专门的

java 从数据库取出数据,精度问题

问题描述 在数据库里存的数据类型为float,查出的数据是31164.6,在java程序中我设的是String类型,从数据库取出,发现这个数变成了31164.600000000002,有什么办法解决? 解决方案 解决方案二:sql里面to_char试试解决方案三:如果是String型的,不应该有精度问题.你是否是将String取出来,然后转float了,这样会有精度问题.如果必须考虑精度问题,建议使用BigDecimal处理,不会有精度损失.解决方案四:sql你数据库什么类型,你取时候就用对应的

Java核心技术 卷Ⅰ 基础知识(原书第10版)

Java核心技术系列 Java核心技术 卷Ⅰ 基础知识 (原书第10版) Core Java Volume I-Fundamentals (10th Edition) [美] 凯S.霍斯特曼(Cay S. Horstmann) 著 周立新 陈 波 叶乃文 邝劲筠 杜永萍 译 图书在版编目(CIP)数据 Java核心技术 卷Ⅰ 基础知识(原书第10版) / (美)凯S. 霍斯特曼(Cay S. Horstmann)著:周立新等译. -北京:机械工业出版社,2016.8 (Java核心技术系列) 书

由浮点数的精度问题引出设计问题

本文由ruby-china的一篇帖子"由小数的精度问题引出设计问题"引出,帖子也是我发的,在查看回复的时候学到了不少内容,有了一点感悟,所以就想总结一下. 首先声明本文选用的编程语言为ruby,运行环境是ubuntu. 在编写财务,电子商务之类应用的时候,经常会碰到小数,小数乘.除.加.减的场景. 大多数语言表示小数,都有单精度float,双精度double,还有一个更加精确的decimal,无论是哪一种,都统称为浮点数. 浮点数是一个近似的数值,不是精确的数值.至于为什么不精确,这个

JAVA基础--重新整理(1)后版

比较喜欢用demo来讲解. 变量: 1 2 3 4 5 6 7 8 public static void main(String[] args) {         int age;//变量声明         age = 16;//变量的初始化,第一次赋值         age = 15;//变量的赋值         System.out.println(age);//15,   访问变量         int score = 100;//变量声明初始化         System.o

Java面试笔试题大汇总(最全+详细答案)

声明:有人说, 有些面试题很变态,个人认为其实是因为我们基础不扎实或者没有深入.本篇文章来自一位很资深的前辈对于最近java面试题目所做的总结归纳,有170道题目 ,知识面很广 ,而且这位前辈对于每个题都自己测试给出了答案 ,如果你对某个题有疑问或者不明白,可以电脑端登录把题目复制下来然后发表评论,大家一起探讨,也可以电脑端登录后关注我给我发私信,我们一起进步! 以下内容来自这位前辈 2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题