Java 对sqlite中存储为bigint的货币(加密)的数学操作

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

我试图在sqlite数据库中存储加密货币值。 我了解到,将这些值存储为float或double是不正确的,因为IEEE754会导致精度损失。 因此,我在数据库中将该值保存为biginteger。(在读取或存储值之前,我会在应用程序中乘以或除以10^8或10^(-8)

但现在我有一个问题:假设我想用这个公式计算硬币的数量:

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";