为什么除法会导致无理数,而应该有余数,则为实心

问题描述

我有以下可靠性合同:

// 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”。我阅读了一堆帖子并尝试了该功能等的所有不同类型的变体。我在这里缺少什么?这里的文档 (https://docs.soliditylang.org/en/v0.7.6/types.html#rational-literals) 说我应该得到一个理性作为 v0.4.0 后的输出

解决方法

Solidity 在某种程度上能够与理性一起工作。但是你返回的是一个整数。

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
   }
}

目前没有原生十进制数据类型(用于存储或返回十进制数)。

但是,大多数实现使用预定义的小数位数,并将小数位数用作 10 的指数。

示例:带有 1 小数的 2 标记通常存储为值为 100 的整数。当您向某人发送 0,5 代币时,存储的金额将减去 {​​{1}}。