Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
货币值的Redis精度浮点精度问题_Redis_Lua_Ieee 754 - Fatal编程技术网

货币值的Redis精度浮点精度问题

货币值的Redis精度浮点精度问题,redis,lua,ieee-754,Redis,Lua,Ieee 754,我已经在寻找这个问题的适当解决办法。 问题是浮点(IEEE 754)。 这个问题对我来说并不新鲜。。。在java中我使用BigDecimal,在JS中我使用bignumber.JS 不幸的是,我在Redis中找不到合适的解决方案。这似乎是最基本的东西,需要支持,所以我肯定我错过了一些东西 例如: >set key 100000 >incrbyfloat key -0.0002 预期值:99999.9998 实际值:99999.9998000000005 我想在lua中实现我自己的

我已经在寻找这个问题的适当解决办法。 问题是浮点(IEEE 754)。 这个问题对我来说并不新鲜。。。在java中我使用
BigDecimal
,在JS中我使用
bignumber.JS

不幸的是,我在Redis中找不到合适的解决方案。这似乎是最基本的东西,需要支持,所以我肯定我错过了一些东西

例如:

>set key 100000

>incrbyfloat key -0.0002
预期值:99999.9998 实际值:99999.9998000000005


我想在lua中实现我自己的
incrbyfloatbig
,然后在Redis计算中使用它,但我不知道如何…

当你谈论货币价值时-你需要的精度是多少?通常在网上商店这样的货币交易中只使用2位数,对于银行账户来说,这可能是另一回事。我想到了一些想法:在代码中使用整数值并除以10^x,将其四舍五入,甚至更好。我将其用于加密。小数点后有很多数字。。例如:以太坊最小值为0.000000000000000001这实际上是一个基数和表示问题,而不是精度问题。所使用的浮点格式是基于二进制的,它将数字表示为2的幂的倍数,包括负幂,如½,¼,⅛, 等等0002不是任何二次幂的精确倍数,因此无论精度有多高,它都无法以二进制格式精确表示。要使用二进制基数进行精确运算,您必须选择一个可表示的测量单位,例如使用阿以太坊(10**-18以太坊)而不是以太坊作为单位。一旦选择了一个单位,您可能需要对所使用的运算和值进行一定的关注。如果您需要使用10**18的单位操作整个以太坊,则数字可能会超过浮点格式中可表示的数值。这是一个精度问题,因为限制是使用的位数,而不是基数,并且浮点格式可能不足以满足您的需要。感谢您的澄清。我会很高兴得到一个来源或东西的链接。。因为我确定问题是浮点,我找不到任何东西。当你谈论货币价值时,你需要的精度是多少?通常在网上商店这样的货币交易中只使用2位数,对于银行账户来说,这可能是另一回事。我想到了一些想法:在代码中使用整数值并除以10^x,将其四舍五入,甚至更好。我将其用于加密。小数点后有很多数字。。例如:以太坊最小值为0.000000000000000001这实际上是一个基数和表示问题,而不是精度问题。所使用的浮点格式是基于二进制的,它将数字表示为2的幂的倍数,包括负幂,如½,¼,⅛, 等等0002不是任何二次幂的精确倍数,因此无论精度有多高,它都无法以二进制格式精确表示。要使用二进制基数进行精确运算,您必须选择一个可表示的测量单位,例如使用阿以太坊(10**-18以太坊)而不是以太坊作为单位。一旦选择了一个单位,您可能需要对所使用的运算和值进行一定的关注。如果您需要使用10**18的单位操作整个以太坊,则数字可能会超过浮点格式中可表示的数值。这是一个精度问题,因为限制是使用的位数,而不是基数,并且浮点格式可能不足以满足您的需要。感谢您的澄清。我会很高兴得到一个来源或东西的链接。。因为我确定问题出在浮点上,我什么也找不到。