一、类型表示

Solidity 还没有完全支持定长浮点型。可以声明定长浮点型的常量,但不能给它们赋值或把它们赋值给其他变量。

以下定义来自solidity官方文档说明:

fixed / ufixed 表示各种大小的有符号和无符号的定长浮点型。 在关键字 ufixedMxNfixedMxN 中,M 表示该类型占用的位数,N 表示可用的小数位数。 M 必须能整除 8,即 8 到 256 位。 N 则可以是从 0 到 80 之间的任意数。 ufixedfixed 分别是 ufixed128x19fixed128x19 的别名。

但是当前版本的remix还不支持这些关键字。

 function floatType() public pure returns(int8){
        fixed128x19 a = (10*9)/3 ; //编译不通过
        return 10;
    }

使用这些关键字会提示:

UnimplementedFeatureError: Not yet implemented - FixedPointTyp

没有变量类型,并不意味着在solidity中不能使用浮点数。 solidity支持在常量中使用浮点数。 在solidity中不引入浮点数类型,因为浮点运算存在不确定性。这在java和c语言中都有的问题。 本质上来说,所有的数字都可以转换为整数,主要是看看可以接受的精度。 而在金融领域,对于币值,都有一个可以接受 、不可切分的最小单位。 比如人民币一般都以分计算,在绝大部分场景下,是没有更小的计量单位了。 美元中美分是最小币值;以太币中,wei是最小币值,挖矿的gas一般都是10^7。 所以,在设计应用时,需要考虑到这个能够接受的最小的单位是多少。 在内部计算时,可以使用到浮点数,但是最终存储或者对外输出时,都需要按照给定的精度,转成整数。 比如内部计算,以元为单位,得到 1.234元的结果。经确认,在本应用中, 0.0001元可以满足精度上的要求,那可以将0.0001作为本币值的最小单位,对外出输出1.234*10^4,即12340。

二、运算符

三、有理数和整型常量(Rational and Integer Literals)

整型常量是由一系列0-9的数字组成,10进制表示。不支持其他进制包括8进制,前置0在当前版本的Solidity语法中是无效的。

10进制小数常量(Decimal fraction literals)带了一个., 在.的两边至少有一个数字,有效的表示如:1., .21.2

科学计数也支持,基数可以是小数,指数必须是整数, 有效的表示如: 2e10, -2e10, 2e-10, 2.5e1

可以使用_来分隔数字,提升可读性。 比如123_000, 0x2eff_abde, 1_2e345_678,都是合法的表达式。

数字常量表达式本身支持任意精度,也就是可以不会运算溢出,或除法截断。 但当它被转换成对应的非常量类型,或者将他们与非常量进行运算,则不能保证精度了。

如:(2800 + 1) - 2800的结果为1(uint8整类) ,尽管中间结果已经超过计算机字长。另外:.5 * 8的结果是4,尽管有非整形参与了运算。

pragma solidity ^0.4.24;

contract Literals {
    function IntType() public pure returns(int8, int8){
        int8 a = 32*65535 + 2 - 65535*32 ; // 2,按照最终结果来转换
		int8 b = .5*8; //4, 0.5不会被提前转换为0 ; 
        return (a, b);
    }
  
}

输出:

    0: int8: 2
    1: int8: 4

只要操作数是整形,整型支持的运算符都适用于整型常量表达式。如果两个操作数是小数,则不允许进行位运算,指数也不能是小数。 如果计算公式中有变量,那就会被转换为非常量的类型了,如下会编译不通过:

uint8 a = 2;
uint8 b = 2.4 + a + 0.6;

Solidity对每一个有理数都有一个数值常量类型。整数常量和有理数常量从属于数字常量。所有的数字常表达式的结果都属于数字常量。所以1 + 2和2 + 1都属于同样的有理数的数字常量3

四、整数常量除法

在早期的版本中是被截断的,但现在可以被转为有理数了:

    function divType() public pure returns(int8){

        return (5/2)*10;
    }
  

在java语言中,上述返回值为 20; 但在solidity中,返回值是25, 即在常量运算中不会改变精度和调整数值范围。


感谢您对本文的关注,如果您对区块链技术有兴趣,可以加入我们一起探讨, 请扫码关注“可可链”的微信公众号,并留言“加入可可链”。

本文欢迎转载,转载时请注明本文来自 微信公众号“可可链”。