Java 对sqlite中存储为bigint的货币(加密)的数学操作
我试图在sqlite数据库中存储加密货币值。 我了解到,将这些值存储为float或double是不正确的,因为IEEE754会导致精度损失。 因此,我在数据库中将该值保存为biginteger。(在读取或存储值之前,我会在应用程序中乘以或除以10^8或10^(-8) 但现在我有一个问题:假设我想用这个公式计算硬币的数量:Java 对sqlite中存储为bigint的货币(加密)的数学操作,java,sqlite,currency,cryptocurrency,Java,Sqlite,Currency,Cryptocurrency,我试图在sqlite数据库中存储加密货币值。 我了解到,将这些值存储为float或double是不正确的,因为IEEE754会导致精度损失。 因此,我在数据库中将该值保存为biginteger。(在读取或存储值之前,我会在应用程序中乘以或除以10^8或10^(-8) 但现在我有一个问题:假设我想用这个公式计算硬币的数量: SELECT "coin_name", ("total_fiat_amount"-"commission")/(&q
SELECT "coin_name", ("total_fiat_amount"-"commission")/("crypto_fiat_price")) AS crypto_amount FROM Transactions GROUP BY "coin_name";
但是结果总是错误的,因为它总是整数(小数部分总是被截断和省略)。我需要一个真实的数字,但不损失精度,因为我需要负担得起的结果
对于一个变通方法,我可以将1.0转换为double或multiply,但这不是我想要的,因为这样做我认为我会在double中得到错误的结果!(因此我可以从一开始就使用double)
有没有可行的解决办法?
(除了避免使用sql进行此类计算和在应用程序中进行计算,因为这不是有效的解决方案)关键是只需乘以divident,而不是乘以结果 如果
total_fiat_amount-commission
和crypto_fiat_price
都是单元值,逗号后最多有两位数字,则不需要两者都乘以10^8,只需乘以10^2即可
在这种情况下,结果将精确到逗号后0个小数点的精度
如果希望逗号后有8个十进制精度,可以在运行除法之前将divident乘以10^8
如果您将总法定金额
、佣金
和加密法定价格
存储为美分,您可以使用以下方法:
SELECT "coin_name", (("total_fiat_amount"-"commission")*100000000)/("crypto_fiat_price")) AS crypto_amount FROM Transactions GROUP BY "coin_name";
这将
total\u fiat\u amount-commission
限制为64位整数限制除以10^8,因此total\u fiat\u amount-commission
的最大限制为92233720368
(美分)计算中涉及的所有列都具有整数相关性,因此SQLite执行整数除法(按设计)。你不能改变这个,所以乘以1.0好,但是如果我乘以1.0,我会得到一个双精度。所以我可能会因为精度的损失而得到错误的结果。。。还是我错了?那么从一开始不使用double有什么好处呢?这种情况没有好处。看起来很奇怪。这意味着不可能使用sqlite创建可靠的加密货币应用程序。如果我只能将数据存储为整数,但不能使用值进行除法或执行聚合函数,那就太疯狂了。很难相信没有解决方案,我认为有很多android应用程序使用sqlite进行加密。它们是如何工作的呢?我不知道,但也许它们在应用程序级别进行这种计算,而不是在数据库引擎中。
SELECT "coin_name", (("total_fiat_amount"-"commission")*100000000)/("crypto_fiat_price")) AS crypto_amount FROM Transactions GROUP BY "coin_name";