JAVA 精度损失 求大神指教

图片说明
这里的0.1不是默认是double类型,为什么会产生精度损失?求大神指教

0

7个回答

高精度的加法计算,用BigDecimal,具体原因可以百度BigDecimal

3

高精度的加法计算,用BigDecimal

1

你都不把你的结果贴出来,鬼知道

0
qq_27389569
qq_27389569 结果我贴在楼下了
2 年多之前 回复

![图片说明](https://img-ask.csdn.net/upload/201703/24/1490327530_63523.png)图片说明

0

double是浮点数,不精确的,不能用于精确运算。
public static Double add(Double value1, Double value2) {
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
return b1.add(b2).doubleValue();
}

0

java计算,尽量采用BigDecimal来处理;

public static void main(String[] args) {
    double a =0;
    for(a=0; a!=10;){
        a = getA(a);
        if(a>10){
            break;
        }else{
            System.out.println(a);
        }
    }
}

public static double getA(double a){
    BigDecimal aBigDecimal = new BigDecimal(a);
    aBigDecimal = (aBigDecimal.add(new BigDecimal("0.1"))).divide(new BigDecimal("1"),1,2);
    return aBigDecimal.doubleValue();
}
0

多看看java代码优化的文章...大多数都提到了的.....高精度计算用bigdecimal

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
java 浮点数精度损失
一、整型转浮点型精度损失  以int 和 float 为例 ,Int是4字节32位来表示的,float虽然也是4字节32位,但是二者的存储结构是很不一样的 float的存储结构是1个符号位,8个指数位,23个尾数。 float只能有24位来确定精度,而int是32位 举个例子: 以下程序可以得出 20014999 在 double 和 float 下的二进制表示方
JAVA溢出和精度损失
开发工具与关键技术:MyEclipse 10 JAVA 作者:黄冠棋 撰写时间:2019年04月7日 十进制是人类最为方便的进制表示也是日常生活中最常用的数制,但用计算机处理十进制数必须要把十进制数转换成二进制数。 十进制转成二进制:取余法 将88转换成二进制 88除以2 商为44 余数为0 44除以2 商为22 余数为0 22除以2 商为11 余数为0 11除以2 商为5 余数为1 5除以2 商...
Java精度损失
对于Java的float和double类型,都存在精度损失的问题。 精度损失产生的原因在于Java的数据存储采用的都是2进制形式,二进制不能准确的表示1/10等分数,只能无限趋近。 对比float,double,BigDecimal的精度: public static void main(String[] args){ float a = (float) 1.0; float...
损失精度
我才开学JAVA,昨晚遇到一个问题,byte的范围最大是到127,可是当我编写如下代码rnbyte a = 50;rnbyte b = 60;rnbyte c = a + b;rnSystem.out.println(c);rn的时候,却报错损失精度,c的结果110按理说没有超出范围,如果把c改成int型,或者用byte c = (byte)(a+b)则可以通过,这是为什么?敬请请不吝赐教。
java double 精度损失问题
System.out.println(2.0 - 0.7);输出1.3rnSystem.out.println(2.0 - 1.7);输出0.30000000000000004rn为啥2.0-0.7没有精度损失啊????????
Java 数据转换精度损失问题
import java.util.Scanner; rnpublic class DisplayTimernpublic static void main(String[]args)rnSystem.out.println("enter an integer for seconds:");rnScanner input=new Scanner(System.in);rnint seconds=input.nextInt();rnint minutes=seconds/60;rnint remain=seconds%60;rnSystem.out.println(seconds+"seconds is "+minutes+"minutes is"+remain+"seconds");rnrnrnrn如果是System.ou.print(1.0-0.9);这样的浮点数结果不是0.1而是0.099999999.这是怎么回事rn
浮点型损失精度现象
原因:小数转化为二进制时候有一种情况 变为无限.  而保证准确的话 需要无限的内存,所以理论上无法实现. 因此会出现上述情况
js大数损失精度
例如一个订单号,想在js中获取: 订单号为: 201805221651325797 js中获取输出结果为: 201805221651325800 解决办法是将订单号改为字符型,这样获取的时候就不会有精度损失的情况出现...
关于损失精度的提示
float f1=1/3;rn int i=1/3;rn float f2=1*3.0;rn double f3=1.0/3;rnrn请问第三行为什么会提示损失精度。。。1*3.0不可能超过float的范围吧。。是java的规定吗
解决精度损失问题
package com.tapi.esb.common.rule.logic;import java.math.BigDecimal;/** * TOPMathUtil * @author lubin * */ public class MathUtil { /** * 两个double相加,解决精度损失问题 * @param a * @param b
绘制精度和损失曲线
程序说明 时间:2019年2月9日 说明:该程序是一个包含两个隐藏层的神经网络,程序会保存每轮训练的acc和loss,并且绘制它们。 数据集:MNIST 1.加载keras模块 from __future__ import print_function import numpy as np np.random.seed(1337) # for reproducibility import ke...
float double的精度损失
转:http://blog.csdn.net/fanfanjin/article/details/6908333 说的比较全面,但里面float四舍五入使用BigDecimal的方式有误,应为以下:   float d = 18896.45f; BigDecimal b = new BigDecimal(Float.toString(d));System.out.println(b.s...
小心精度的损失!
declare @ table (a real , b float , c numeric(17 , 16))rninsert into @ values(2.0/10 , 2.0/10 , 2.0/10)rninsert into @ values(2.0/10 , 2.0/10 , 2.0/10)rninsert into @ values(2.0/10 , 2.0/10 , 2.0/10)rninsert into @ values(2.0/10 , 2.0/10 , 2.0/10)rninsert into @ values(2.0/10 , 2.0/10 , 2.0/10)rninsert into @ values(2.0/10 , 2.0/10 , 2.0/10)rninsert into @ values(2.0/10 , 2.0/10 , 2.0/10)rninsert into @ values(2.0/10 , 2.0/10 , 2.0/10)rninsert into @ values(2.0/10 , 2.0/10 , 2.0/10)rninsert into @ values(2.0/10 , 2.0/10 , 2.0/10)rnselect sum(a) , sum(b) , sum(c) from @rnrn----------------------------------------------------- ----------------------------------------------------- ---------------------------------------- rn2.0000000298023224 1.9999999999999998 2.0000000000000000rnrn(所影响的行数为 1 行)rn
006.精度损失
9/2和9/2.0有什么区别呢,在现实世界中,他们的结果是没有不同的,都是4.5,但是在计算机中却很不一样。 9,2这两个数字是整形数字,也就是常说的int类型,而2.0,则是浮点型数据。浮点型默认类型是什么呢?double类型。显然的,double类型的范围比int类型的范围要大。 而在一个算式中,计算结果应取范围大的那个,所以在9/2.0中,我们的结果是浮点型,而在9/2中,结果是整形,即
Hive损失精度
问题起因:hive中计算丢失精度.decimal默认整数.解决方案:cast (val as DECIMAL(38,10))
double类型精度损失问题
在十进制中小数有些是无法完整用二进制表示的。它们只能用有限位来表示,从而在存储时可能就会有误差。十进制的小数采用乘2取整法进行计算,去掉整数部分后,剩下的小数继续乘以2,直到小数部分全为0. 有的小数可能取不到零就会一直循环 0.9*2=1.8…...取整1 0.8*2=1.6…...取整1 0.6*2=1.2…...取整1 0.2*2=0.4.…..取整0 0.4*2=0.8…....
.toFixed()为什么精度损失
v8核心代码中对于小数存储位双精度浮点,即64位保存的,但是这64位又分为三部分。   ​  1、由于52位尾数用于记录数值,所以前端的精准位数应该是2^53-1即15位。当超过15位的时候就会出现精度损失。 2、小数的存储模式:          例如:2.55     2.55的二进制位   10.1000110011001100...循环   写成2的科学记数法位 1.010...
数据类型转换损失精度
Java语言中默认整数类型是 int,默认小数类型是 double。   /* */ class Demo { public static void main(String[] args) { byte b = 3;//3是int 定义byte时自动进行类型转换 b = b + 2;//2是int byte + int 会自动提升数据类型,再赋值给b会损失精度 ...
Float.ToString()精度损失怎么办?
[code=C#]float s = 4649896.4689f;rn Response.Write(s.ToString());[/code]rnrn结果却是4649897.如果用户就输入了三位小数位,我要原样显示,但是这一ToString()就全变了,咋办?rnrn
float除法精度损失
今天遇到一个问题百思不得其解:一个float a=2.1,int b=100*a/10。b的结果理论上应该是21吧,但是实际结果却是20,精度损失了,a=2.2就没有精度损失,这是为什么呢?double型的也没有损失?请各位指点
double精度损失
使用bigdecimal
关于精度损失的问题 50分求
rn 我有一副图片,在窗口的正中显示,当窗口长宽变化时候,rnrnfloat ratio=图片的长/图片的高;rnrn图片的高=窗口的高*0.9rn图片的长=图片的高 *ratio;rn也就是图片按比例不变的放大缩小,rn但是,每次由float 到int 都有点精度损失,多拖拉几次图片就会变形,rn请问,除了四舍五入法,还有什么好的方法可以防止这种情况出现呢?
(详解)Java数据类型转换以及精度损失的问题
在Java语言基础中, 数据类型分为基本数据类型和引用数据类型. 在这里, 从计算机底层(二进制的层面)介绍和分析基本数据类型(也就是四类八种)的转换. 而且转换分为两种 -- 隐式转换和强制转换. 隐式转换     A: 案例演示         a: int + int         b: byte + int     B: Java中的默认转换规则         取值
java double 做运算精度损失问题
看代码: double a = 0.01; double b = 0.0109; double c=a+b; System.out.println(c); 大家看到这里说结果肯定是:0.0209; 计算机运算结果:0.020900000000000002由此可见这里存在精度问题,在支付等方面这就是非常重要
java浮点数精度损失原理和解决
java浮点数精度损失原理和解决浮点数会有精度损失,如下代码所示public class NumTest { public static void main(String[] args) { double a =1; double b =0.99; System.out.println(a-b); } }这段代码运行结果很简单,不是0.0
java 返回前端 long 类型损失精度
一、局部转换 二、配置全局转换器 1、实现 WebMvcConfigurer 接口 2、重写 configureMessageConverters 方法 import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import com.f...
初学Java求大神指教
本人初学Java,求大神推荐几本入门的好教材,有电子档更好。。。
java 大神们,求指教
java里rnString b=new String("asdf");rnrnb在栈中,new的string对象在堆中,请问b在栈中是否分配内存,若分配其内存里的值是这个new出来对象的地址吗,若是为什么System.out.print(b);输出的值不是这个地址,而是asdfrn求各路大神前来讨论
java小白,求大神指教
按照书上的自己用txt写了一个,然后改了后缀存到C盘了,为毛在命令里面输入以后是这个情况?[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/onion/3.gif][/img][img=https://img-bbs.csdn.net/upload/201411/24/1416798995_531516.jpg][/img][img=https://img-bbs.csdn.net/upload/201411/24/1416799008_929305.jpg][/img]
Java 加减乘除工具类(解决精度损失问题)
唔,其实里面就是一个工具类,加减乘除、保留两位小数。一共5个方法。。。emmmm.....为啥分这么高呢。因为宝宝想分想疯了。 附代码,有土豪就打赏打赏,没土豪的直接拿去使吧。 package cn.cisdom.base.utils; import java.math.BigDecimal; import java.text.DecimalFormat; public class Calculation { public static final DecimalFormat df = new DecimalFormat("######0.00"); /** * @methodName format2point * @desc 保留两位小数点 * @param value * @return java.lang.String * @author xm * @create 2018/6/7 12:03 **/ public static String format2point(Number value) { return df.format(value); } public static Double add(Number value1, Number value2) { BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue())); BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue())); return b1.add(b2).doubleValue(); } /** * 提供精确的减法运算。 * * @param value1 * 减数 * @param value2 * 被减数 * @return 两个参数的差 */ public static Double sub(Number value1, Number value2) { BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue())); BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue())); return b1.subtract(b2).doubleValue(); } /** * 提供精确的乘法运算。 * * @param value1 * 被乘数 * @param value2 * 乘数 * @return 两个参数的积 */ public static Double mul(Number value1, Number value2) { BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue())); BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue())); return b1.multiply(b2).doubleValue(); } /** * 提供精确的除法运算。 * * @param value1 * 除数 * @param value2 * 被除数 * @return 除数/被除数 */ public static Double div(Number value1, Number value2) { //MathContext mc = new MathContext(2, RoundingMode.HALF_DOWN);//精度为2,舍入模式为大于0.5进1,否则舍弃 BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue())); BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue())); return b1.divide(b2).doubleValue(); } public static void main(String[] args) { Double aDouble=Calculation.add(56.9, 1.67); System.out.println(aDouble); Double bDouble=Calculation.sub(99.2,aDouble); System.out.println(bDouble); } }
JAVA 强制转换运算导致的精度损失
导致精度损失后,是如何处理的?也就是说,强制转换的时候,精度损失有什么损失规律吗?能否不运行该程序就可以看出来损失后的结果应该是什么?
double 计算时精度损失
计算double类型的数时有时候会多出0.000000001,会有不确定个数的0,在计算时将其转为BigDecimal就不会出错。 BigDecimal sum = new BigDecimal(0.0); BigDecimal tmp = new BigDecimal(0.0); for(int i=0; i<list.size(...
PHP浮点数精度损失问题
      首先抛出一个问题,如下类似: <?php $a = 0.57; echo intval(floatval($a) * 100); //56     结果可能有点出乎你的意外,PHP遵循IEEE 754双精度:     浮点数, 以64位的双精度, 采用1位符号位(E), 11指数位(Q), 52位尾数(M)表示(一共64位)     符号位:最高位表示数据的...
C 中精度损失问题
C 中精度损失问题,定义了一个rnrnunsigned char *temp;rnu_short *aaa;rntemp = (unsigned char *)ptr; //ptr 是unsigned char类型的指针rnaaa = (unsigned short *)ptr;rnrn(1 & (int) temp)rn总是提示上边这行从“u_short”到‘int’的转换损失精度rn怎么解决这个精度损失的问题? 编译器可以编译通过,同时不会因为精度损失造成运行错误。rnrn谢谢,不好意思,小弟没有分,但是希望能帮我解决下 rn
后台Long到前台损失精度
后台Long到前台损失精度 在Long字段上加注解@JsonSerialize(using = JsonIDSerializer.class)
JS中数字的精度损失
JS数字的精度损失 所有数字都是以 64 位浮点数形式储存,即便整数也是如此。 所以我们在打印 1.00 这样的浮点数的结果是 1 而非 1.00 任何一门语言都会存在数字的精度损失问题,计算机只识别二进制,用户输入十进制的数字之后,计算机会将其转化成二进制进行运算,在转化成10进制返回给用户,在这些转化中可能会存在一些误差, 这里有一些经典的例子 0.1 + 0.2 运算结果:0.300...
Mysql精度损失--隐式类型转换的坑
    今天在工作中遇到一个小问题,很不起眼的问题,但是很严重.就是mysql精度损失.   为什么我们在进行mysql操作的时候要加引号呢?通常都是字符串需要加引号,而数字就不需要加引号,但是这次我在纯数字的字符串中没有加引号,所以问题就出现.     contract是varchar类型,长度为64SELECT * FROM contractinfo WHERE contract = 5101...
为什么说可能损失精度?
class wornrn byte a=-7,c=~a;rn void wohanyi()rn rn System.out.println(c);rn rn public static void main(String[] args)rn rn rn wo woo=new wo();rn woo.wohanyi(); rn rnrnrn初学JAVA,字节类型的是-128到127,这个程序编译时候怎么能说可能损失精度呢?没有超出这个范围啊?
这个函数有没有精度损失?
[code=C/C++]rnint min(int a,int b)rnrn int div,temp,c,min;rn div=a;rn temp=b;rn while(div%temp)rn rn c=div%temp;rn div=temp;rn temp=c;rn rn min=a*b/temp;rn return (min);rn[/code]rn求两个数的最小公倍数,先求出最大公约数,再两个数相乘除以他们的最小公倍数。rnacm提交一直不正确,后来改写成以下代码就可以了。请问是不是因为精度的关系呢?rn[code=C/C++]int yue(int a,int b)rnrn int t;rn while(a%b)rn t=a%b;rn a=b;rn b=t;rn rn return(b);rnrnint bei(int a,int b)rnrn return a/yue(a,b)*b;rn[/code]
Python中的精度损失问题
Python中的精度损失问题引言示例问题问题解决 引言 在写python程序时,我们不可避免地要和小数打交道,但是python的小数有一个精度损失的问题,那么怎样来解决呢? 示例问题 加入你想开发一个程序将一定数量的钱分类成几个更小的货币单元。这个程序让用户输入总金额,这是一个用元角分来表示的浮点值,然后输出一个报告,罗列出等价的货币:XX元X角X分的,如示例运行所示: # 我们先以11.56为案...
相关热词 c#异步发送kafka c#窗体编号 c# 操作二进制文件 c# 反射 机制 c#线程 窗体失去响应 c#角度转弧度 c# 解析gps数据 c# vs设置 语法版本 c# json含回车 c#多线程demo