division calculates a wrong value
1 次查看(过去 30 天)
显示 更早的评论
I have this Market class which adjusts the price of two cryptocurrencies. This method allows you to buy the first cryptocurrency by selling the second.
tokenBobtained = abs(obj.supplyB - (obj.k / obj.supplyA));
disp(tokenBobtained) % print 182
obj.supplyB = obj.k / obj.supplyA;
obj.priceB = (transactionVolume * obj.priceA) / tokenBobtained; % ERROR!
tokenBobtained in the example is 182, but in the last line the result of obj.priceB is not the one hoped for.
obj.priceB in the end of execution is 1 but it should be 0.55. The cool thing is that if I replace 182 with "tokenBobtained" in the last line I get 0.55, but in this way it doesn't work! What's the problem?
3 个评论
回答(1 个)
Walter Roberson
2023-5-24
移动:Walter Roberson
2023-5-24
initialSupply (1,1) uint64 {mustBePositive} = 1
Operations on uint64 return uint64.
Division with integer datatypes round before conversion to integer data type.
2 个评论
Steven Lord
2023-5-24
The k property of the Market class is uint64 and that gets used in the originally posted code.
You could convert those integer values to double before dividing with / or you could use the idivide function, which lets you control how the result is rounded. Though idivide does not allow you to perform the division between a double and a 64-bit integer so unless you need to allow values of k outside the range of a 32-bit integer I'd store that property as a uint32.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Fuzzy Inference System Modeling 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!