{"content":{"title":"Solidity 算术","body":"算术在 Solidity 中的行为与其他语言完全相同，因此我们在这里不会过多赘述。\r\n\r\n你可以这样相加数字\r\n\r\n```solidity\r\n\r\nuint256 sum = 10 + 5; // sum == 15\r\n\r\nuint256 x = 1;\r\nuint256 y = 2;\r\n\r\nuint256 anotherSum = x + y; // anotherSum == 3\r\n\r\n```\r\n\r\n指数运算与其他 C 类语言相同。\r\n\r\n```solidity\r\n\r\nuint256 exp = 2 ** 3; // exp == 8\r\n\r\n```\r\n\r\n取模运算也是如此\r\n\r\n```solidity\r\n\r\nuint256 remainder = 10 % 4; // remainder == 2\r\n\r\n```\r\n\r\n减法、乘法和除法是显而易见的，因此我不会侮辱你的智商，教你如何做这些。\r\n\r\n**Solidity 不支持浮点数**\r\n\r\n如果你尝试将 5 除以 2，你不会得到 2.5。你将得到 2。请记住，uint256 是无符号整数。因此，你所做的任何除法都是整数除法。\r\n\r\n但如果你真的想知道 200 的 10% 是多少呢？这对计算利息来说似乎是非常合理的。\r\n\r\n```solidity\r\n\r\nuint256 interest = 200 * 0.1; // 失败，0.1 无效\r\n\r\n```\r\n\r\n解决此问题的方法是将 x _0.1 转换为 x_ 1 / 10。这是有效的，并将产生正确的答案。\r\n\r\n```solidity\r\n\r\nuint256 interest = 200 / 10;\r\n\r\n```\r\n\r\n如果你的利息是 7.5% 这样的数额，那么你需要做以下操作\r\n\r\n```solidity\r\n\r\nuint256 interest = 200 * 75 / 1000;\r\n\r\n```\r\n\r\n如果你想知道一个城市与一个国家的相对人口百分比，你不能这样做。\r\n\r\n```solidity\r\n\r\nuint256 cityPopulation = 1000;\r\nuint256 nationPopulation = 10000;\r\n\r\nuint256 fractionOfPopulation = cityPopulation / nationPopulation;\r\n//fractionOfPopulation 为零！\r\n\r\n```\r\n\r\n这需要一个更复杂的解决方案，我们将稍后描述。\r\n\r\n**注意：** 为什么 Solidity 不支持浮点数？浮点数并不总是确定的，而区块链必须是确定的，否则节点不会就交易结果达成一致。例如，如果你把 2/3 除，一些计算机会返回 0.6666，而其他则返回 0.66667。这个不一致可能导致区块链网络分裂！因此，Solidity 不允许使用浮点数。\r\n\r\n**Solidity 不会出现下溢或上溢，它会停止执行**\r\n\r\n如果你尝试做以下操作，会发生什么？\r\n\r\n```solidity\r\n\r\nfunction subtract(uint256 x, uint256 y)\r\n        public\r\n        pure\r\n        returns (uint256) {\r\n            uint256 difference = x - y;\r\n            return difference;\r\n}\r\n\r\n```\r\n\r\n如果 x 是 2 而 y 是 5，会发生什么？你不会得到负 3。实际上，发生的情况是执行将停止并产生 **revert**。\r\n\r\nSolidity 不会抛出异常，但你可以将 **revert** 视为其他语言中未捕获异常或恐慌的等价物。\r\n\r\n以前，Solidity 允许上溢和下溢，但这导致了足够多的智能合约崩溃或被黑客攻击，因此该语言在语言中内置了上溢和下溢保护。这一特性是在 Solidity 0.8.0 版本之后添加的。\r\n\r\n你可能现在已经注意到，许多 Solidity 文件都有一行\r\n\r\n```solidity\r\n**pragma solidity ^0.8.0;**\r\n\r\n```\r\n\r\n这意味着源代码是以 0.8.0 或更高版本编译的。如果你看到早于该版本的版本，则不能假设代码内置了上溢保护。\r\n\r\n**如果你想允许下溢和上溢，你需要使用未检查的块**\r\n\r\n你可以使用未检查的块来允许下溢和上溢。除非你有非常充分的理由这样做，否则不推荐这样使用。未检查的块可以这样使用：\r\n\r\n```solidity\r\n\r\nuint256 x = 1;\r\nuint256 y = 2;\r\n\r\nunchecked {\r\n    uint256 z = x - y; // z == 2**256 - 1\r\n}\r\n\r\n```\r\n\r\n请注意，在未检查的块中的任何内容即使在上溢或下溢时也不会 **revert**。这是一项非常高级的功能，除非你知道自己在做什么，否则不应使用。\r\n\r\n**练习题**\r\n\r\n[加法](https://github.com/RareSkills/Solidity-Exercises/tree/main/Add)\r\n\r\n[除法](https://github.com/RareSkills/Solidity-Exercises/tree/main/Divide)\r\n\r\n[指数](https://github.com/RareSkills/Solidity-Exercises/tree/main/Exponent)\r\n\r\n[未检查](https://github.com/RareSkills/Solidity-Exercises/tree/main/Unchecked)\r\n\r\n###  深入了解更多\r\n\r\n查看  [ 区块链训练营](https://learnblockchain.cn/openspace/1) ，以了解更多关于智能合约开发和代币标准的内容。\r\n\r\n \r\n>- 原文链接： [rareskills.io/learn-soli...](https://www.rareskills.io/learn-solidity/arithmetic)\r\n>- 登链社区 AI 助手，为大家转译优秀英文文章，如有翻译不通的地方，还请包涵～"},"author":{"user":"https://learnblockchain.cn/people/20722","address":null},"history":null,"timestamp":1740625428,"version":1}