首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

doublelong引发的一次线上故障

问题背景 问题:部分客户订单页面展示异常问题 原因:double类型转成long类型,精度损失导致线上的故障。...下面为出现问题的具体代码 图片 问题验证 我们看下面会分别输出什么结果: 图片 837378982649737216 837378982649737276 837378982649737276 为什么精度会丢失: double...类型占用64位 1bit(符号位) 11bit(指数位) 52bit(尾数位) 科学计数法:拿十进制举例子:1.23x10的9次方:1.23就是尾数,9就是指数 所以double类型表示的数的范围是比...long类型要大,但是,由于浮点数是基于科学计数法的,因此它们不能精确地表示某些值,例如非常大或非常小的数字。...建议: 禁止直接将double类型转成long类型,对于一些高精度计算推荐使用BigDecimal BigDecimal是Java中提供的一种高精度数字类型,它可以表示任意精度的十进制数值,计算过程中不会有精度损失

1.3K91
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java BigDecimal和double-BigDecimaldouble-doubleBigDecimal

    第三行:问题在于Double.toString会使用一定的精度来四舍五入double,然后再输出。会。...2.如果你使用Double.toString来把double转化字符串,然后调用BigDecimal(String),这个也是不靠谱的,它不一定按你的想法工作。...3.如果你不是很在乎是否完全精确地表示,并且使用了BigDecimal(double),那么要注意double本身的特例,double的规范本身定义了几个特殊的double值(Infinite,-Infinite...所以, 把double强制转化成int确实是扔掉小数部分,但是你写在代码中的值,并不一定是编译器生成的真正的double值。...()); // 1024 System.out.println(Long.toHexString(Double.doubleToRawLongBits(d))); // 4090000000000000

    2.4K20

    Java 中 longdouble 的原子性?

    ---- java中基本类型中,longdouble的长度都是8个字节,32位(4字节)处理器对其读写操作无法一次完成,那么,JVM,longdouble是原子性的吗?...如果JVM要保证longdouble读写的原子性,势必要做额外的处理。 那么,JVM有对这一情况进行额外处理吗?...如果使用volatile修饰longdouble,那么其读写都是原子操作 对于64位的引用地址的读写,都是原子操作 在实现JVM时,可以自由选择是否把读写longdouble作为原子操作 推荐JVM...实现为原子操作 从程序得到的结果来看,32位的HotSpot没有把longdouble的读写实现为原子操作。...因此我们可以猜测,在64位的环境下,longdouble的读写有可能是原子操作。

    2.2K20

    doublebigDecimal精度问题

    doublebigDecimal精度问题 需要用到bigDecimal的字符串构造来 float的精度 : 2^23 7位 double的精度: 2^52 16位 十进制 二进制 存在精度差 double...这里有一个小知识:既然float和double型用来表示带有小数点的数,那为什么我们不称 它们为“小数”或者“实数”,要叫浮点数呢?因为这些数都以科学计数法的形式存储。...在《Effective Java》这本书中也提到这个原则,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用java.math.BigDecimal。...BigDecimal(double val) BigDecimal(String val) 上面的API简要描述相当的明确,而且通常情况下,上面的那一个使用起来要方便一些。...Thus, the long value that is being passed in to the constructor is not exactly equal to .1, appearances

    2K10

    String转为long 类型报错原因:要转为long必须是int、double、float型

    遇到该问题的解决办法一: String strTime = "12.5416132"; double dblTime = Double.parseDouble(strTime); long lngTime...= new Double(dblTime).longValue(); log.info("lngTime:"+lngTime); 具体报错原因请看下面的例子和解释: 上例子: string a =100.1...; long b=long.parse(a); 转换时报 “输入字符串的格式不正确” 当a =100.0 时 long b=long.parse(a,NumberStyles.AllowDecimalPoint..., 原因解释: 问题一:long是整形也就是Int64类型,parse的对象必须是整形 问题二: 当a =100.0 时 long b=long.parse(a,NumberStyles.AllowDecimalPoint...,对于这个错误,可以先把a=100.1做一个转换变成整形,或者使用范围更广的double或decimal来parse,如decimal.Parse("100.1", NumberStyles.AllowDecimalPoint

    2.3K40
    领券