为什么除法会导致非有理数,当应该有余数时,在 solidity
Why does division result in a non-rational number, when there should be a remainder, in solidity
我有以下 solidity 合约:
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.8.0;
contract AverageStream {
uint private count;
uint private pre_average;
constructor() {
count = 0;
pre_average = 0;
}
function add_element(uint num) public {
count += 1;
pre_average += num;
}
function get_average() public view returns (uint) {
return uint(pre_average) / uint(count);
}
}
然后我通过以下方式调用它并在 Python 中使用它:
Average_Stream.functions.add_element(5).transact()
Average_Stream.functions.add_element(2).transact()
Average_Stream.functions.get_average().call()
在我期望 3.5 的地方输出“3”。我读了一堆 posts 并尝试了该函数等的所有不同类型的变体。我在这里错过了什么?这里的文档 (https://docs.soliditylang.org/en/v0.7.6/types.html#rational-literals) 说我应该得到一个理性的输出 post v0.4.0.
Solidity 在某种程度上能够与理性一起工作。但是你 return 是一个整数。
pragma solidity ^0.7.0;
contract Test {
function divide() public pure returns (uint) {
return uint(7) / uint(2); // 7/2 is 3.5, but returns uint(3.5) which is 3
}
function add() public pure returns (uint) {
return 3.5 + 0.5; // returns 4
}
}
目前没有原生十进制数据类型(用于存储或 return 十进制数)。
但是,大多数实现使用预定义的小数位数并将小数位数用作 10 的指数。
示例:1
带有 2
小数位的令牌通常存储为值为 100
的整数。当您向某人 0,5
发送代币时,存储的金额会减去 50
。
我有以下 solidity 合约:
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.8.0;
contract AverageStream {
uint private count;
uint private pre_average;
constructor() {
count = 0;
pre_average = 0;
}
function add_element(uint num) public {
count += 1;
pre_average += num;
}
function get_average() public view returns (uint) {
return uint(pre_average) / uint(count);
}
}
然后我通过以下方式调用它并在 Python 中使用它:
Average_Stream.functions.add_element(5).transact()
Average_Stream.functions.add_element(2).transact()
Average_Stream.functions.get_average().call()
在我期望 3.5 的地方输出“3”。我读了一堆 posts 并尝试了该函数等的所有不同类型的变体。我在这里错过了什么?这里的文档 (https://docs.soliditylang.org/en/v0.7.6/types.html#rational-literals) 说我应该得到一个理性的输出 post v0.4.0.
Solidity 在某种程度上能够与理性一起工作。但是你 return 是一个整数。
pragma solidity ^0.7.0;
contract Test {
function divide() public pure returns (uint) {
return uint(7) / uint(2); // 7/2 is 3.5, but returns uint(3.5) which is 3
}
function add() public pure returns (uint) {
return 3.5 + 0.5; // returns 4
}
}
目前没有原生十进制数据类型(用于存储或 return 十进制数)。
但是,大多数实现使用预定义的小数位数并将小数位数用作 10 的指数。
示例:1
带有 2
小数位的令牌通常存储为值为 100
的整数。当您向某人 0,5
发送代币时,存储的金额会减去 50
。