Blockchain 以太坊稠度计算的奇怪行为

Blockchain 以太坊稠度计算的奇怪行为,blockchain,ethereum,solidity,calculation,Blockchain,Ethereum,Solidity,Calculation,我写了下面这个简单的代码来计算一些数字。但是,以太坊区块链在每个功能上提供不同的输出。我的代码有什么问题吗?或者是以太坊区块链问题 我的实体代码: pragma solidity ^0.4.24; contract Calculate { uint balance = 50000000000000000000; function done() public pure returns (uint) { return (50000000000000000000

我写了下面这个简单的代码来计算一些数字。但是,以太坊区块链在每个功能上提供不同的输出。我的代码有什么问题吗?或者是以太坊区块链问题

我的实体代码:

pragma solidity ^0.4.24;

contract Calculate {

    uint balance = 50000000000000000000;

    function done() public pure returns (uint) {
        return (50000000000000000000 / 3000) * 3000;
    }

    function fail() public view returns (uint) {
        return (balance / 3000) * 3000;
    }

}
done() function returns 50000000000000000000

fail() function returns 49999999999999998000
输出:

pragma solidity ^0.4.24;

contract Calculate {

    uint balance = 50000000000000000000;

    function done() public pure returns (uint) {
        return (50000000000000000000 / 3000) * 3000;
    }

    function fail() public view returns (uint) {
        return (balance / 3000) * 3000;
    }

}
done() function returns 50000000000000000000

fail() function returns 49999999999999998000
请在此处查看实时示例:

我认为问题在于,在
done
的情况下,编译器实际上不会发出代码来进行计算。相反,计算是在编译时完成的,并在其位置放置一个常量


与运行时的EVM不同,编译器支持十进制数学。例如,您可以编写
0.5以太
,尽管EVM对数字0.5没有表示。

我认为问题在于,在
done
情况下,编译器实际上不会发出代码来进行计算。相反,计算是在编译时完成的,并在其位置放置一个常量

与运行时的EVM不同,编译器支持十进制数学。例如,尽管EVM没有表示数字0.5的表示,您仍可以编写
0.5以太