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

为什么Nashorn将两个整数相加产生双精度?

Nashorn是Java 8引入的一种JavaScript引擎,它允许在Java虚拟机中执行JavaScript代码。在Nashorn中,当两个整数相加时,结果会被转换为双精度浮点数。

这是因为JavaScript中的数字类型是基于IEEE 754标准的双精度浮点数。在JavaScript中,所有数字都被表示为双精度浮点数,包括整数。因此,当执行两个整数相加的操作时,JavaScript引擎会将结果转换为双精度浮点数。

这种行为的原因是为了保持JavaScript的动态性和灵活性。JavaScript中的数字类型可以容纳非常大的数值范围,并且可以进行浮点数运算,这对于处理科学计算、金融数据等场景非常有用。

然而,需要注意的是,由于浮点数的精度限制,对于一些需要精确计算的场景,例如货币计算,应该使用专门的库或技术来处理,以避免由于浮点数运算带来的精度损失。

腾讯云提供了多种云计算相关的产品和服务,例如云服务器、云数据库、云存储等。具体推荐的产品和产品介绍链接地址可以根据实际需求和场景进行选择,可以参考腾讯云官方网站或咨询腾讯云的客服人员获取更详细的信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

数值信息的机器级存储

为什么两个整数相加之后的结果会变成负数? 等等这些类似问题,其实都归咎于 计算机中是如何存储各种类型的数值的。...下图是浮点数存储的标准格式,当然单精度在各自的模块使用的位数不尽相同。...[image] IEEE 标准规定,单精度精度浮点数的存储格式如下: [image] 我们分几种情况来讨论这个浮点数的二进制存储。...有人可能会好奇,为什么不直接存储 E 呢,而是选择加上一个 Bias 再存呢? 因为计算机在进行加法运算的时候,如果两个浮点数的阶码不同,会首先统一一下两者的阶码,然后将他们的尾数部分相加。...IEEE 标准规定,单精度浮点数的这个 Bias 为 127,精度的 Bias 为 1023 。

1.3K60

为什么0.1+0.2不等于0.3?原来编程语言是这么算的……

现在,有两种显示浮点数的方法:单精度精度。在进行浮点运算时,单精度使用 32 位,而精度使用 64 位。...与许多其他编程语言不同,JavaScript 并未定义不同类型的数字数据类型,而是始终遵循国际 IEEE 754 标准,数字存储为精度浮点数。...IEEE754 精度标准。 我们按 IEEE754 标准用 64 位表示 0.1。第一步是十进制的 0.1 转换为二进制的 0.1。...首先将 0.1 乘以 2,然后小数点前的数字分离出来,得到其相应的二进制数。 ? 重复此操作至 64 位。然后把它们按升序排列,获取尾数,再根据精度标准,我们将把其四舍五入到 52 位。 ?...两个相加,得到: ? 转换为浮点数,它变成: ? 这就是 0.1 + 0.2 = 0.30000000000000004 的原因。

1.1K10

为什么0.1+0.2不等于0.3?

现在,有两种显示浮点数的方法:单精度精度。在进行浮点运算时,单精度使用 32 位,而精度使用 64 位。...与许多其他编程语言不同,JavaScript 并未定义不同类型的数字数据类型,而是始终遵循国际 IEEE 754 标准,数字存储为精度浮点数。...IEEE754 精度标准。 我们按 IEEE754 标准用 64 位表示 0.1。第一步是十进制的 0.1 转换为二进制的 0.1。...首先将 0.1 乘以 2,然后小数点前的数字分离出来,得到其相应的二进制数。 ? 重复此操作至 64 位。然后把它们按升序排列,获取尾数,再根据精度标准,我们将把其四舍五入到 52 位。 ?...两个相加,得到: ? 转换为浮点数,它变成: ? 这就是 0.1 + 0.2 = 0.30000000000000004 的原因。

1.7K20

你不会知道编程语言会把0.1+0.2算成多少

现在,有两种显示浮点数的方法:单精度精度。在进行浮点运算时,单精度使用 32 位,而精度使用 64 位。...与许多其他编程语言不同,JavaScript 并未定义不同类型的数字数据类型,而是始终遵循国际 IEEE 754 标准,数字存储为精度浮点数。...IEEE754 精度标准。 我们按 IEEE754 标准用 64 位表示 0.1。第一步是十进制的 0.1 转换为二进制的 0.1。...首先将 0.1 乘以 2,然后小数点前的数字分离出来,得到其相应的二进制数。 ? 重复此操作至 64 位。然后把它们按升序排列,获取尾数,再根据精度标准,我们将把其四舍五入到 52 位。 ?...两个相加,得到: ? 转换为浮点数,它变成: ? 这就是 0.1 + 0.2 = 0.30000000000000004 的原因。

1.2K20

5.9 汇编语言:浮点数操作指令

例如,一个精度浮点数和一个32位整数相加,可以使用以下指令: fld qword ptr [x] ; 精度浮点数x装载到栈顶 fiadd dword ptr [y] ; 32位整数y装载到浮点寄存器中...,并与栈顶的浮点数相加 fstp qword ptr [z] ; 浮点栈顶的值存储到精度浮点数z中 FADDP 指令也是用于两个浮点数相加,但是会将结果弹出并存储到目标寄存器或内存中。...例如,两个精度浮点数相加并将结果存储到内存中,可以使用以下指令: fld dword ptr [x] ; 精度浮点数x1装载到栈顶 fadd dword ptr [y] ; 精度浮点数...y装载到栈顶,并与浮点寄存器中的整数相加 fstp dword ptr [z] ; 浮点栈顶的值存储到精度浮点数z中 如下汇编代码分别总结四种不同的浮点数计算方式,读者可自行根据提示信息理解这其中的含义...第四种:是与整数相加,默认会将整数扩展为精度,然后在于ST(0)相加

40720

JavaScript 浮点数之迷:0.1 + 0.2 为什么不等于 0.3?

十进制小数转二进制,小数部分,乘 2 取整数,若乘之后的小数部分不为 0,继续乘以 2 直到小数部分为 0 ,取出的整数正向排序。...在 JavaScript 中不论小数还是整数只有一种数据类型表示,这就是 Number 类型,其遵循 IEEE 754 标准,使用精度浮点数(double)64 位(8 字节)来存储一个浮点数(所以在...尾数 M IEEE 754 规定,在计算机内部保存 M 时,默认这个数的第一位总是 1,因此可以被舍去,只保存后面部分,这样可以节省 1 位有效数字,对于精度 64 位浮点数,M 为 52 位,第一位的...在精确度浮点数下二进制数公式 V 演变如下所示: 指数 E E 为一个无符号整数,在精度浮点数中 E 为 11 位,取值范围为 ,即表示的范围为 0 ~ 2047。...另外我们在 0.1 与 0.2 相加做对阶、求和、舍入过程中也会产生精度的丢失。

3.9K31

5.9 汇编语言:浮点数操作指令

例如,一个精度浮点数和一个32位整数相加,可以使用以下指令:fld qword ptr [x] ; 精度浮点数x装载到栈顶fiadd dword ptr [y] ; 32位整数y装载到浮点寄存器中...,并与栈顶的浮点数相加fstp qword ptr [z] ; 浮点栈顶的值存储到精度浮点数z中FADDP 指令也是用于两个浮点数相加,但是会将结果弹出并存储到目标寄存器或内存中。...例如,两个精度浮点数相加并将结果存储到内存中,可以使用以下指令:fld dword ptr [x] ; 精度浮点数x1装载到栈顶fadd dword ptr [y] ; 精度浮点数...装载到栈顶,并与浮点寄存器中的整数相加fstp dword ptr [z] ; 浮点栈顶的值存储到精度浮点数z中如下汇编代码分别总结四种不同的浮点数计算方式,读者可自行根据提示信息理解这其中的含义...第二种:则是两个浮点寄存器相加,最后的结果会存储在源操作数ST(0)中。第三种:则是内存操作数,就是ST寄存器与内存相加。第四种:是与整数相加,默认会将整数扩展为精度,然后在于ST(0)相加

83530

浮点数精度问题透析:小数计算不准确+浮点数精度丢失根源

浮点数丢失产生原因 JavaScript 中的数字类型只有 Number 一种,Number 类型采用 IEEE754 标准中的 “精度浮点数” 来表示一个数字,不区分整数和浮点数 (js位运算或许是为了提升...0.0001 1001 1001 1001…(无限循环) 同理0.2的二进制是0.0011 0011 0011 0011…(无限循环) IEEE-745浮点数表示法存储结构 在 IEEE754 中,精度浮点数采用...java精度类型 double也是如此。...为什么采用二进制 二进制在电路设计中物理上更易实现,因为电子器件大多具有两种稳定状态,比如晶体管的导通和截止,电压的高和低,磁性的有和无等。而找到一个具有十个稳定状态的电子器件是很困难的。...JS数字精度丢失的一些典型问题 两个简单的浮点数相加 0.1 + 0.2 !

2.9K30

浮点数精度问题透析:小数计算不准确+浮点数精度丢失根源

浮点数丢失产生原因 JavaScript中的数字类型只有 Number 一种,Number 类型采用 IEEE754 标准中的 “精度浮点数” 来表示一个数字,不区分整数和浮点数 (js位运算或许是为了提升...0.0001 1001 1001 1001…(无限循环) 同理0.2的二进制是0.0011 0011 0011 0011…(无限循环) IEEE-745浮点数表示法存储结构 在 IEEE754 中,精度浮点数采用...java精度类型 double也是如此。...为什么采用二进制 二进制在电路设计中物理上更易实现,因为电子器件大多具有两种稳定状态,比如晶体管的导通和截止,电压的高和低,磁性的有和无等。而找到一个具有十个稳定状态的电子器件是很困难的。...JS数字精度丢失的一些典型问题 两个简单的浮点数相加 0.1 + 0.2 !

3K20

计算误差的真相:为什么 float 加法会出现精度损失?

在大多数编程语言中,float类型通常使用32位来表示,也被称为“单精度浮点数”或“单精度实数”。它可以表示的数值范围比整数类型要大得多,并且可以存储小数位数较多的数值。...二、为什么会出现float相加精度损失?浮点数在计算机内部是以二进制表示的,但是很多十进制小数无法完全用二进制精确表示,因此在进行浮点数的加减乘除等运算时,可能会出现一定程度的精度损失。...具体来说,IEEE 754标准定义了两种浮点数格式:单精度浮点数和精度浮点数。单精度浮点数占用32位,其中1位表示符号位,8位表示指数,23位表示尾数。...例如,对于以下两个浮点数:0.1 和 0.2,将它们相加,得到的结果应该是0.3,但实际上计算机可能会返回一个略微不同的结果,如0.30000000000000004。...避免多次重复相加相减。如果需要对同一组数进行多次相加或相减运算,可以先将它们全部相加或相减,然后再进行其它计算,以减少误差的产生。对于需要高精度计算的场景,采用相关算法优化。

23100

JavaScript之0.1+0.2=0.30000000000000004的计算过程

(Double)存储number,所以它是用 64 位的二进制来存储 number 的 ---- 十进制与 Double 的相互转换公式如下: V:表示十进制的结果 SEM:表示精度浮点数的结果(就是...---- 所以用一句话来解释为什么JS有精度问题: 简洁版: 因为JS采用Double(精度浮点数)来存储number,Double的小数位只有52位,但0.1等小数的二进制小数位有无限位,所以当存储...考虑周到版: 因为JS采用Double(精度浮点数)来存储number,Double的小数位只有52位,但除最后一位为5的十进制小数外,其余小数转为二进制均有无限位,所以当存储52位时,会丢失精度!...: ① 为什么不用误差更小的「验证方法一」呢?...② 为什么「验证方法二」的结果误差比较大?

1.2K30

小小的 float,藏着大大的学问

接着,我们看看「整数类型」的数字在计算机的存储方式,这其实很简单,也很直观,就是十进制的数字转换成二进制即可。...---- 十进制小数与二进制的转换 好了,整数十进制转二进制我们知道了,接下来看看小数是怎么转二进制的,小数部分的转换不同于整数部分,它采用的是乘 2 取整法,十进制中的小数部分乘以 2 作为二进制的一位...这两个结果相加就是 0.300000004470348358154296875: ?...所以,你会看到在计算机中 0.1 + 0.2 并不等于完整的 0.3,这主要是因为有的小数无法可以用「完整」的二进制来表示,所以计算机里只能采用近似数的方式来保存,那两个近似数相加,得到的必然也是一个近似数...0.1 + 0.2 并不等于完整的 0.3,这主要是因为这两个小数无法用「完整」的二进制来表示,所以计算机里只能采用近似数的方式来保存,那两个近似数相加,得到的必然也是一个近似数。 ----

1.7K20

一道送命题:0.1+0.2 等于 0.3 吗?

这道题,对于非科班出身的前端人是一道送命题,有些知道 0.1+0.2 不等于 0.3,但是继续深问为什么,就无法很清晰地回答。...2、转成浮点数 浮点数分为单精度对应32位操作系统和精度对应64位操作系统。目前的操作系统大多是64位操作系统,故这里只解释一下二进制如何转成双精度浮点数的二进制。...精度浮点数用1位表示符号位,11位表示指数位,52位表示小数位,如下图所示: ? 符号位:正数为0,负数为1; 指数位:阶数+偏移量,阶数是: ? ,e为阶码的位数。...浮点数相加 浮点数相加时,需要先比较指位数是否一致,如果一致则小数位直接相加,如果不一致,要先把指位数调成一致的,指位数小的向大的调整。...第二次在 0.1 和 0.2 转成二进制浮点数后,二进制浮点数相加的过程中,小数位相加导致小数位多出了一位,又要让第53位的数进行为1则进1为0则舍去的操作,又造成一次精度丢失。

1.4K20

0.1+0.2!=0.3的分析

在JS中数字采用的IEEE 754的精度标准进行存储(存储一个数值所使用的二进制位数比较多,精度更准确) 示例 在定点数中,如果我们以8位二进制来存储数字。...对于整数来说,十进制的35会被存储为: 00100011 其代表 2^5 + 2^1 + 2^0。...JS中采用的IEEE 754的精度标准也是一样的道理在存储空间有限的情况下,当出现这种无法整除的小数的时候就会取一个近似值,在js中如果这个近似值足够近似,那么js就会认为他就是那个值。...重点来了 在0.1 + 0.2这个式子中,0.1和0.2都是近似表示的,在他们相加的时候,两个近似值进行了计算,导致最后得到的值是0.30000000000000004,此时对于JS来说,其不够近似于0.3...当然,也并非所有的近似值相加都得不到正确的结果。 解决办法 想办法规避掉这类小数计算时的精度问题就好了,那么最常用的方法就是浮点数转化成整数计算。因为整数都是可以精确表示的。

61630

【C 数据存储详解】(1)——深度剖析整形数据在内存中的存储

double //精度浮点数 以及他们所占存储空间的大小(单位是字节): #include int main() { printf("%d\n", sizeof(char...double 精度浮点型 (3).构造类型 数组类型 结构体类型 struct 枚举类型 enum 联合类型 union (4).指针类型 int pi; char pc...举个例子: 再看一个负数: 整数的2进制表示方法有原码、反码和补码,那内存中存的到底是啥哪? 对于整形来说:数据存放内存中其实存放的是补码。 为什么呢?...而如果直接两个操作数的原码进行相加,是可能会出错的: 举个例子: 1+(-1),我们用原码相加,得到错误的结果 用补码计算: 最终用补码相加得到的结果才是正确的!!!...大家可以自己试一下 然后我们创建两个变量,看一下,内存给我们展示出来的是不是补码: 我们可以看到对于a和b分别存储的是补码。但是我们发现顺序有点不对劲,好像是相反的。 这是又为什么

19110
领券