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

为什么在lua中乘法和除法有时不是相同的精度?例如下面的例子

在Lua中,乘法和除法有时不是相同的精度是因为Lua中的数字类型是双精度浮点数(64位浮点数),而不是精确的十进制数。由于浮点数的特性,它们无法精确地表示所有的十进制数。

在计算机中,浮点数的表示是基于二进制的,而十进制数则是基于十进制的。这导致了在进行浮点数计算时可能会出现舍入误差。

例如,考虑以下Lua代码片段:

代码语言:lua
复制
local a = 0.1
local b = 0.3

local c = a * b
local d = b / a

print(c) -- 输出结果为0.03
print(d) -- 输出结果为2.9999999999999996

在这个例子中,我们期望乘法的结果为0.03,除法的结果为3。然而,由于浮点数的舍入误差,乘法的结果实际上是0.03,而除法的结果是一个接近3的近似值。

这种舍入误差是由于浮点数的内部表示方式造成的,它会在计算过程中累积,并最终导致结果的不准确性。因此,在Lua中进行浮点数计算时,我们应该意识到可能会出现精度问题,并在需要精确计算的情况下采取适当的措施,例如使用整数运算或使用Lua的精确计算库。

在Lua中,可以使用math.floor函数对浮点数进行向下取整,以减少舍入误差的影响。例如:

代码语言:lua
复制
local a = 0.1
local b = 0.3

local c = math.floor(a * b * 100) / 100
local d = math.floor(b / a * 100) / 100

print(c) -- 输出结果为0.03
print(d) -- 输出结果为3

通过将乘法和除法的结果乘以一个较大的数(例如100),然后向下取整,我们可以获得更接近预期结果的精度。

总之,在Lua中,乘法和除法有时不是相同的精度是由于浮点数的舍入误差所致。为了避免精度问题,可以采取适当的措施,如使用整数运算或精确计算库。

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

相关·内容

Go语言中常见100问题-#19 Not understanding floating points

在双精度浮点类型(float64)中,分别用11个和52个bit位表示指数和尾数,剩下的1个bit位表示符合。可以用下面的计算公式将浮点数转为十进制数。...原本1.0001在计算机中的存储的实际值是1.000100016593933,所以缺少精度会影响存储值的准确性。 通过上面的一个具体的例子了解了浮点数在计算机中存储的是近似值。...事实上,当执行操作涉及加法、减法、乘法和除法时,先进行乘法和除法运算,能够获得更好的精度。...Go语言中float32和float64在计算机中是一种近似值表示,因此,我们必须牢记下面的规则: 当比较两个浮点数时,检查它们的差值是否在可接受的范围内,而不是直接 == 进行比较 当执行加法或减法时...,为了获得更好的精度,可以根据运算级进行分组 为了提高准确性,如果一系列运算需要加法、减法、乘法或除法,先执行乘法和除法运算

71320

Nodejs学习笔记(十七)--- 浮点运算decimal.js

前言  开发过程中免不了有浮点运算,JavaScript浮点运算的精度问题会带来一些困扰  JavaScript 只有一种数字类型 ( Number )  JavaScript采用 IEEE 754 标准双精度浮点...(64),64位中 1位浮点数中符号,11存储指数,52位存储浮点数的有效数字  有时候小数在二进制中表示是无限的,所以从53位开始就会舍入(舍入规则是0舍1入),这样就造成了“浮点精度问题”(由于舍入规则有时大点...  示例: 0.029 / 10   预期结果:0.0029   实际结果:0.0029000000000000002 说明:以上加、减、乘、除示例分别演示了JavaScript运算结果(当然实际结果并不是我们想要的...),为什么会出现这样的结果,前言中已经说明^_^!...说明: “浮点问题”不算是问题,它一直就是这样,也不是JavaScript独有的, 所以这个锅不应该它背^_^!

3.6K80
  • 漏洞连载|浮点与精度处理不当的那些事儿

    构造函数中的owner权限既不可过于强大也不可落入他人之手。继承中的父类函数变量和新声明的子类函数变量有微妙的差别,名字相同的情况下,调用父类函数操作的会是父类的变量。...然而,在合约的数学运算中,其实不仅仅只有溢出的问题,还有与精度密切相关的除法运算以及浮点。...所以我们可以说,计算的精度关键不在于它的频率和内存,而在于它是如何设计、表示、以及计算的。 在Solidity中,浮点和精度也存在类似的争议,本期我们就来探讨计算浮点产生的精度漏洞。...在上面的例子中,购买代币的计算是msg.value/weiPerEth*tokenPerEth。请注意,这里的除法发生在乘法之前。...如果计算首先进行乘法,然后再进行除法,那么这个例子会达到更高的精度,例如修改为msg.value*tokenPerEth/weiPerEth。

    1.1K10

    C语言高效编程与代码优化

    这是一个消耗很大的操作,应该尽可能的避免执行。有时,可以通过乘法表达式来替代除法。例如,假如我们知道b是正数并且b*c是个整数,那么(a/b)>c可以改写为a>(c*b)。...合并除法和取余数 在一些场景中,同时需要除法(x/y)和取余数(x%y)操作。这种情况下,编译器可以通过调用一次除法操作返回除法的结果和余数。...block-sie的值设置为8仅仅适用于测试的目的,只要我们重复执行“loop-contents”相同的次数,都会有很好的效果。在这个例子中,循环条件每8次迭代才会被检查,而不是每次都进行检查。...先验函数,例如sin、exp和log是通过一系列的乘法和加法实现的(使用了精度扩展)。这些操作比通常的乘法至少慢十倍。 简化浮点运算表达式。编译器并不能将应用于整型操作的优化手段应用于浮点操作。...编译器可以在一个文件中进行优化-避免将相关的函数拆分到不同的文件中,如果将它们放在一起,编译器可以更好的处理它们(例如可以使用inline)。 单精度函数比双精度更快。

    3.3K10

    【万字长文】C语言高效编程与代码优化,建议收藏!

    这是一个消耗很大的操作,应该尽可能的避免执行。有时,可以通过乘法表达式来替代除法。例如,假如我们知道b是正数并且b*c是个整数,那么(a/b)>c可以改写为a>(c*b)。...合并除法和取余数 在一些场景中,同时需要除法(x/y)和取余数(x%y)操作。这种情况下,编译器可以通过调用一次除法操作返回除法的结果和余数。...block-sie的值设置为8仅仅适用于测试的目的,只要我们重复执行“loop-contents”相同的次数,都会有很好的效果。在这个例子中,循环条件每8次迭代才会被检查,而不是每次都进行检查。...先验函数,例如sin、exp和log是通过一系列的乘法和加法实现的(使用了精度扩展)。这些操作比通常的乘法至少慢十倍。 简化浮点运算表达式。编译器并不能将应用于整型操作的优化手段应用于浮点操作。...编译器可以在一个文件中进行优化-避免将相关的函数拆分到不同的文件中,如果将它们放在一起,编译器可以更好的处理它们(例如可以使用inline)。 单精度函数比双精度更快。

    1.7K20

    Python数据类型之数字类型

    所以在Python里 / 表示的为浮点数除法,// 表示的为整数除法 3. bool类型 4....所以在Python里,1和0分别可以代表True和False,至于为什么是1和0,这就是十进制的问题了,有兴趣的同学可以自行查阅,在这不再阐述 为了进一步说明为什么布尔值是数字类型,看下面代码: ?...bool()是python内置的函数,根据括号里面的参数返回真或假 但是是不是只有1和0表示True和False呢? ?...上面其实就是二进制代表下的1和0 下面再拓展一下,并不是只有数字类型才能转成布尔类型。 用字符串来表示True或者False: ? 可见,只要是非空字符都表示为True。...这个也是False的一个例子。 以上就是Python数据类型中的数字类型 。

    98520

    C++学习——数据类型(强制)转换详解

    在下面的表达式中,假设 years 是一个 int 变量,而 interestRate 是一个 double 变量: years * interestRate 在乘法发生之前,years 中的值将升级为...和 width 中的值是相同的数据类型,所以它们都不会被转换为任何其他数据类型。...例如,来看下面的代码段。...而 number 的值仍为 3.7,保持不变。 类型转换表达式在 C++ 不能自动执行所需转换的情况下很有用。 下面的程序显示了使用类型强制转换表达式来防止发生整除法的示例。...警告,为了防止发生整除法,在除法运算之前,其中一个操作数应该转换为一个 double 双精度值。这将强制 C++ 自动将其他操作数的值也转换为双精度值。

    1.7K10

    16位汇编第六讲汇编指令详解第二讲

    ,还有流水线的作用,上面的代码看着很恶心,可是真是的环境就是这样,不是教你怎么去写,而是教你怎么去看,让你明白他为什么这样写.当然流水线的优化还有很多种.这里只是最简单的一个例子        3.乘法指令...这里看一下,除法的指令周期很长,最低的70-77,所以也可以优化 这里可以看出  al要放乘数  其余寄存器放乘数 例如   ax = bl * al(他是乘数,你给多少,都是和他相乘的) 汇编例子 mov...*16 则放在 DX(数据寄存器)(AX累加寄存器)当中 高16位放到DX当中,低16位放到AX中 其中乘法的 操作数都需要我们自己给,比如 MUL bl, 算出bl的乘法,默认会和al相乘 乘法指令是利用...相同为假,不同为真,ax和ax肯定各个二进制位相同,此时相同为0,则都变成0了) 和上面的一样,ax都是变为0,而我则赚了一个1个指令周期,其实还有很多这样的汇编代码,都是这样做出来的 所以说学习汇编,...但是除法有除法优化的原理,以后讲,这里掌握两个指令即可. 5.除法指令 除法指令也分为有符号除法,和无符号除法   ax / r8,m8的商,放到AL中,余数放到AH中   16位除法   ax /r16

    1.2K50

    Mysql 乘法除法精度不一致,除法后四位小数

    所以初步得知Mysql中,乘法和除法对小数点后的精度不一致 在国内的论坛中没有找到合适的资料,于是到国外论坛寻找,提问,交流。...除法的精度默认是小数点后4位 乘法的精度使用操作数的精度和的方式来判断,如例子中的1*0.01 精度分别是小数点后0位和2位,那么就是0+2 =2 结果也将使用2位精度 测试 select 1.00 *...@x和@y就是除数和被除数。 同时我还提出疑问,是否能在mysql里设置默认除法精度,我们就可以不用每次sql都使用函数计算了。...前辈回复:如果你不想有时候出现出乎意料的情况,那么需要每次都强制使用类型转换。...除法的精度规则 由上面引用的文献可知:当使用两个数值进行计算时,结果的精度由第一个操作数的精度 + 系统变量div_precision_increment的值决定,如我们例子中的1 精度是0,系统变量精度是

    3.8K30

    数值信息的机器级存储

    但是我们代码中定义的各种数值又是如何转换为二进制串存储在这些「字节」里面的呢?为什么两个整数相加之后的结果会变成负数? 等等这些类似问题,其实都归咎于 计算机中是如何存储各种类型的数值的。...对于乘法操作而言,大多数计算机都有自己的乘法指令,只不过我们一般不用。原因就是乘法指令非常的慢,耗时。而相对于比较快的移位操作而言,编译器通常会将程序中数值的乘法操作优化为多次的移位操作的组合。...例如:x * 20 = x << 4 + x << 2 。 除法操作也是一个道理,只不过除法是右移。 对于除法来说,还存在一个舍入的问题,就是说,-7/2 的结果应该得到的是 -3 而不是 -4。...下图是浮点数存储的标准格式,当然单双精度在各自的模块使用的位数不尽相同。...有人可能会好奇,为什么不直接存储 E 呢,而是选择加上一个 Bias 再存呢? 因为计算机在进行加法运算的时候,如果两个浮点数的阶码不同,会首先统一一下两者的阶码,然后将他们的尾数部分相加。

    1.3K60

    智能合约安全之算术精度问题

    运算符的优先级 在这里,我们先简单的了解一下运算符的优先级顺序(只讨论+、-、*、/、()): 同级概念 在加、减、乘、除运算中,加法、减法属于同一级别运算,乘法、除法属于同一级别运算 同级运算 从左到右依次运算...,例如: d=a+b-c; 这里的运算顺序为:先计算a与b的和,之后再用运算结果与c做差,然后将最终的结果赋值给d。...算术精度安全问题 了解完上面Solidity的特性以及算术的运算优先级问题之后,我们下面来讨论一下本期正题——算术的精度安全问题。...首先,我们抛出一个问题:"在进行乘法和除法算术运算时,读者觉得应该如何合理的安排运算次序?",很多人可能会哈哈一笑,这不是多此一举吗?之前不是定义了吗?...),所以建议在进行数值运算时先进行乘法运算,后进行除法运算,在某些情况下也可以借助于()来改变优先级运算顺序。

    48430

    数值问题

    数值问题 计算机里面关于数值的处理自有一套体系理论,与现实生活中我们所习惯使用的不太一样。如果对其不了解,在使用计算机的过程中便可能发生一些意想不到的错误。...今天本文就来简明地介绍计算机里面的数值方面的一些知识,并用具体例子来说明可能出现的一些问题。 一些概念 机器数:数值在计算机内部的编码,也就是实际存储的 0/1 序列。...但是负数就有问题了,向下舍入并不是向0舍入,需要校正。 为什么移位来实现除法是向下舍入的呢,正数应该很好理解,右移之后丢掉移出的小数部分,数值自然变小了。...乘除法 浮点数乘法运算过程类似加减法,主要区别在于乘除法不用対阶,其他过程基本一样。...本文很多地方的例子就是采用她书上或者 PPT 中的例子。

    20000

    超全 | 只有高手才知道的C语言高效编程与代码优化方法(二)

    block-sie的值设置为8仅仅适用于测试的目的,只要我们重复执行“loop-contents”相同的次数,都会有很好的效果。 在这个例子中,循环条件每8次迭代才会被检查,而不是每次都进行检查。...在编写浮点操作程序时,记住如下几点: 浮点除法很慢。浮点除法比加法或者乘法慢两倍。通过使用常量将除法转换为乘法(例如,x=x/3.0可以替换为x=x*(1.0/3.0))。...常量的除法在编译期间计算; 使用float代替double。Float类型的变量消耗更好的内存和寄存器,并由于精度低而更加高效。如果精度够用,尽可能使用float; 避免使用先验函数。...先验函数,例如sin、exp和log是通过一系列的乘法和加法实现的(使用了精度扩展)。这些操作比通常的乘法至少慢十倍; 简化浮点运算表达式。编译器并不能将应用于整型操作的优化手段应用于浮点操作。...,如果将它们放在一起,编译器可以更好的处理它们(例如可以使用inline); 单精度函数比双精度更快; 浮点乘法运算比浮点除法运算更快-使用val*0.5而不是val/2.0; 加法操作比乘法快-

    3.9K20

    智能合约审计之算术精度

    我们最常见的运行操作,莫过于一下四种: 加 减 乘 除 PS:这里暂不算“取余”操作,且在Solidity中同样不支持取余操作。...运算符的优先级 在这里,我们先简单的了解一下运算符的优先级顺序(只讨论+、-、*、/、()): 同级概念 在加、减、乘、除运算中,加法、减法属于同一级别运算,乘法、除法属于同一级别运算 同级运算 从左到右依次运算...算术精度安全问题 了解完上面Solidity的特性以及算术的运算优先级问题之后,我们下面来讨论一下本期正题——算术的精度安全问题。...首先,我们抛出一个问题:"在进行乘法和除法算术运算时,读者觉得应该如何合理的安排运算次序?",很多人可能会哈哈一笑,这不是多此一举吗?之前不是定义了吗?...),所以建议在进行数值运算时先进行乘法运算,后进行除法运算,在某些情况下也可以借助于()来改变优先级运算顺序。

    91330

    C语言代码优化的一些经验及小技巧(一)

    2、除法和取余数 在标准处理器中,对于分子和分母,一个32位的除法需要使用20至140次循环操作。除法函数消耗的时间包括一个常量时间加上每一位除法消耗的时间。...这是一个消耗很大的操作,应该尽可能的避免执行。有时,可以通过乘法表达式来替代除法。例如,假如我们知道b是正数并且bc是个整数,那么(a/b)>c可以改写为a>(cb)。...如果把参数名字起为str1和str2,例如: void StringCopy(char*str1,char*str2); 那么我们很难搞清楚究竟是把str1拷贝到str2中,还是刚好倒过来。...回顾上例,C标准库函数的设计者为什么要将getchar声明为令人迷糊的int类型呢? 在正常情况下,getchar的确返回单个字符。...为了区别于正常的字符,只好将EOF定义为负数(通常为负1)。因此函数getchar就成了int类型。 我们在实际工作中,经常会碰到上述令人为难的问题。为了避免出现误解,我们应该将正常值和错误标志分开。

    1.1K32

    《夯实Python基础》(1)

    严格意义上讲,在Python中,数字并不是一种严格意义上的对象类型,而是一组类似类型的分类。...1、‍数字是一种常量 在Python中,数字被定义为一种常量,而且这个常量的大小就是这个数字字面的大小,因此,也被称为字面常量。 例如:1,2,3,4,5 看见上面几个数字了吗?是的,没看见才怪。...是的,因为在Python2的版本中,除法运算,如果除数和被除数都是整数时,结果仅取商的整数部分,并自动剔除了余数。 那如果,我希望得到一个准确的计算结果(含小数的)呢?...对于乘法和除法运算,Python还给出了两种特殊的情况,** 和 //。 这是啥意思?连乘和连除? 不是的!应该说是乘方和整除的意思。...例如: >>> 2**3 >>> 8 它表示2的3次方,也可以说是3个2连乘,所以,结果等于8。这个比较好理解。 但是,如果我们的除法使用//时,对于运算结果,有时就比较容易费解了。 先看例子。

    41441

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

    Java中金额处理选择详解:BigDecimal vs Long vs Double 金额处理是开发中非常重要的一部分,特别是在金融、电商等涉及交易的系统中。...1.1 浮点数的精度问题 Double 使用二进制浮点表示法,遵循 IEEE 754 标准。在该标准下,某些十进制的小数无法精确表示。...例如: System.out.println(0.1 + 0.2); // 输出: 0.30000000000000004 在金额处理场景中,这种误差是不可接受的。...误差会在高频计算中积累,导致严重的金额错误。 1.2 浮点数四则运算不可靠 在加减乘除中,浮点运算会引入更多误差,特别是金额相关场景需要四舍五入等精确处理,Double 的表现力不足。...例如,new BigDecimal("123.45") 直观表示 123.45 元,而不是转换后的整数形式。 3.5 灵活性强 支持任意大小的金额:适用于大型金额处理场景。

    19210

    【游戏开发】小白学Lua——从Lua查找表元素的过程看元表、元方法

    引言 在上篇博客中,我们简单地学习了一下Lua的基本语法。其实在Lua中有一个还有一个叫元表的概念,不得不着重地探讨一下。元表在实际地开发中,也是会被极大程度地所使用到。...本篇博客,就让我们从Lua查找表元素的过程,来探讨学习一下Lua中的元表。 一、什么是元表 在Lua table中我们可以访问对应的key来得到value值,但是却无法对两个table进行操作。...通俗来说,元表就像是一个“操作指南”,里面包含了一系列操作的解决方案,例如__index方法就是定义了这个表在索引失败的情况下该怎么办,__add方法就是告诉table在相加的时候应该怎么做。...下面是一些Lua表中可以重新定义的元方法: __add(a, b) --加法 __sub(a, b) --减法 __mul(a, b) --乘法 __div(a, b) --除法 __mod(a, b)...结合上述的几个小例子,我们再来解释一下__index元方法的含义:在上面的例子中,当访问son.prop1时,son中是没有prop1这个成员的。

    1.8K30

    Facebook新研究优化硬件浮点运算,强化AI模型运行速率

    定点数机制 我们可以设法避免在尾数上进行的乘法和除法运算。尾数可以被看作是小数部分的映射 f(x),它将取值范围在 [0, 1) 间的定点数 x 映射到 [1, 2) 中。...在典型的规格化浮点运算中,f(x) 是仿射函数 1+x(我们称之为线性域数)。 当 f(x) = 2^x 时,我们可以使用对数数字系统(LNS)将乘法和除法变成加法和减法。...其思想不是在浮点运算中进行累加,而是在定点运算中维护一个运行时的和(running sum),这个和需要足够大以避免下溢或溢出。...该转换使用了一个调整因子,它是累加器最多尾数位(在下面的例子中是 6)的有效指数。然后将对齐后的尾数和累加器与进位相加。...缓慢的下溢立刻防止了精度下降,而不是逐渐缓解精度下降,这在 IEEE 754 非规格化表示中是通过尾数部分中前导一的位置解决的。

    1.1K30

    《深入理解计算机系统》阅读笔记--信息的表示和处理(下)

    中间的移位表示要有几个移位,后面的加法/减法表示做几次加法或者减法 除以2的幂 大多数机器上,整数除法要比整数乘法更慢,需要30个或者更多的时钟周期 除以2的幂也可以用移位运算来实现,不过这里用的是右移...关于除以2的幂的补码除法,向上舍入不是非常理解,后面需要再看 ? 在执行算术右移之前加上一个适当的偏执量来修正舍入,看下图: ?...同时补码表示还提供了一种既能表示负数,也能表示正数的灵活方法,使用了与执行无符号算术相同的位级实现,包括:加法,减法,乘法,除法,无论运算是以无符号形式还是以补码形式,都完全一样活着非常类似的位级行为...不同的位数就代表了不同的表示能力,也就是单精度,双精度,扩展精度的来源。 规范化值 在 exp≠000…0 和 exp≠111…1 时,表示的其实都是规范化的值 再来看公式: ?...在这个过程中,既可能会溢出,也可能需要舍入来满足 frac 的精度。

    1.3K30
    领券