首页
学习
活动
专区
圈层
工具
发布

double转long引发的一次线上故障

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

1.7K91

C语言中的浮点类型(float、double和long double)

double:双精度浮点型,提供更高精度,是默认浮点类型。long double:扩展精度浮点型,精度和范围最大,但依赖实现。接下来,我们将逐一深入探讨这三种类型。...C语言long double(扩展精度浮点型)long double 提供比 double 更高的精度和范围,但其具体大小和实现因平台而异。...double ld = 3.14159265358979323846L; // L 表示 long double printf("long double = %.19Lf\n", ld);...\n", sizeof(double));使用场景与注意事项选择合适的类型:简单计算用 float,高精度用 double,极高精度用 long double。...性能权衡:float 计算更快但精度低,long double 精度高但可能更慢。总结C语言的浮点类型 float、double 和 long double 提供了从小到大的精度和范围选择。

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

    Java 中 long 和 double 的原子性?

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

    2.7K20

    Java中金额处理选择详解:BigDecimal vs Long vs Double

    Java中金额处理选择详解:BigDecimal vs Long vs Double 金额处理是开发中非常重要的一部分,特别是在金融、电商等涉及交易的系统中。...以下是对三种方式(BigDecimal、Long、Double)的详细分析,以及为什么推荐 BigDecimal 的原因。 1. Double 为什么不适合处理金额?...例如: double a = 0.1; double b = 0.2; double c = a + b; System.out.println(c == 0.3); // 输出: false 2....例如,除法运算需要恢复小数点,并手动进行舍入处理: long amountInCents = 12345; double amount = amountInCents / 100.0; // 恢复成元...总结与推荐 特性 Double Long BigDecimal 精度 不准确 准确(需手动管理单位) 准确 范围 容易溢出 易溢出(但优于浮点数) 几乎无限 操作复杂度 简单 较复杂(需手动换算) 丰富且灵活

    1.4K10

    java基本数据类型, byte: short: int: long: float: double: float和double有什么区别 boolean: char:

    long: long 数据类型是 64 位、有符号的以二进制补码表示的整数; 最小值是 -9,223,372,036,854,775,808(-2^63); 最大值是 9,223,372,036,854,775,807...(2^63 -1); 这种类型主要使用在需要比较大整数的系统上; 默认值是 0L; 例子: long a = 100000L,Long b = -200000L。...double: double 数据类型是双精度、64 位、符合IEEE 754标准的浮点数; 浮点数的默认类型为double类型; double类型同样不能表示精确的值,如货币; 默认值是 0.0d;...例子:double d1 = 123.4。...double而double的指数范围为-1023~1024 3、表达式指数位不同 float的表达式为1bit(符号位)回+8bits(指数位)+23bits(尾数位) double的表达式为1bit(

    1.6K00

    从硬件角度窥探32位机上Hotspot如何实现volatile修饰的double,long原子性

    仅供参考,如有不妥之处,请多指正 在网上看到许多博客说 java 的 volatile 修饰的 double 和 long 在 32 位机上也是保证原子性的。...但是没有说明为什么,怎么具体实现,是使用互斥量吗,但是要访问的 volatile 修饰的 long,double 变量的地址是随机的,而且数量可能很多 难道要给他们每人配一把 互斥量?...最后要说的是,在 ARM 中,无论是否是 volatile 修饰的 ,long 和 double 都要使用 上述的 ldrexd 和 strexd,所以可以猜测,在 ARM-32 下的hotspot,就算对...long 和 double 不加 volatile 也可以保证写入的原子性(未证实)。...所以在X86下,如果不用volatile 修饰 long 或者 double ,在并发清空下,可能引发一个线程修改了高32位,其他线程读到新的高32位,旧的32位的问题。

    65810

    Java,bit比特,byte字节,char字符,short,int,long,float,double,string,字母,汉字编码等

    -128~127 有 short 16 -32,768~32,767 有 char 16 ‘\u0000’~’\uffff’ 共有65535个字符表示 无 int 32 -232~232 -1 有 long...有 double 64 双精度浮点型 有 参考网址的话,直接上Oracle的官方文档就好: https://docs.oracle.com/javase/tutorial/java/nutsandbolts...个汉字所占的字节数也会有所不同,有些编码是占 2个字节,有些则不是,可能是 3个或者 4个》》 首先认识下Java中的数据类型: 1、Int整型:byte(8位,-128~127)、short(16位)、int(32位)、long...(64位) 2、Float型:float(32位)、double(64位) 3、char字符:unicode字符(16位) 下面参考了这篇文章: char与byte的区别:http://blog.csdn.net

    2.2K20

    long double 类型的属性,操作这些值的时候,为什么是分两次完成的

    1 实现 在Java中,对于long和double类型的属性,数值操作分两次完成的原因与它们的内部表示方式有关。 对于long类型,它的内部表示是64位的有符号整数。...这种拆分操作的方式可以确保对long和double类型的数值操作的正确性,同时也会带来一些性能上的开销。...因此,在进行大量的数值操作时,特别是在循环中,尽量避免频繁地对long和double类型的属性进行操作,以提高性能。...需要注意的是,对于long和double类型的属性,由于其拆分操作的特性,可能会导致在多线程环境下出现线程安全问题。...如果多个线程同时对同一个long或double类型的属性进行操作,可能会出现竞态条件和不一致的结果。

    58940
    领券