由于solidity无法保存小数,并且变量计算中小数点会直接截断【并非四舍五入】,所以在solidity由于中计算小数很头痛!而关于金钱的问题,精度是非常重要的,为了解决这个问题,目前个人觉得:最好的办法就是同时放大分子分母变成整数运算,仅最好一次运算变成小数
小数计算案例:【小数计算,为了确保精度,我们最好先乘法在除法】
value = 1
a = 210
b= 1
c= 0.01(solidity无法保存小数,运算的时候现在1/100)
实际计算公式为:value * a /(b + c / 100) ,但是这个公式计算的结果可能不是你想要的,因为b + c / 100的结果会等于1,后面的0.01会自动截断!所以我们需要转换成整数来运算
分子分母同时放大100倍,如下:value * a *100 /(b + c / 100)*100 = value * a *100 /(b*100 + c),这样b*100 + c就等于101,最后的结果肯定是精度最高的【目前测试最好的方法,解决solidity小数计算问题】
solidity常量和变量截断案例:
pragma solidity ^0.5.0;contract Test {uint c = 5;bytes2 b = "12";输出结果为 4function get_var() public view returns(uint){变量会截断uint a = c/2 + c/2;return a;} 输出结果为 5function get_const() public view returns(uint){常量不会截断uint a = 5/2 + 5/2;return a;}}