【solidity之浮点数计算方法总结】solidity之变量运算小数点会截断,而字面常量运算小数点不会截断

由于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";
    
    输出结果为 4
    function get_var() public view returns(uint){
        变量会截断
        uint a = c/2 + c/2;
        return a;
    }   
    
    输出结果为 5
    function get_const() public view returns(uint){
        常量不会截断
        uint a = 5/2 + 5/2;
        return a;
    }
    
}

 

你可能感兴趣的:(以太坊solidity)