一、类型表示
Solidity 还没有完全支持定长浮点型。可以声明定长浮点型的常量,但不能给它们赋值或把它们赋值给其他变量。
以下定义来自solidity官方文档说明:
fixed
/ ufixed
表示各种大小的有符号和无符号的定长浮点型。
在关键字 ufixedMxN
和 fixedMxN
中,M
表示该类型占用的位数,N
表示可用的小数位数。
M
必须能整除 8,即 8 到 256 位。
N
则可以是从 0 到 80 之间的任意数。
ufixed
和 fixed
分别是 ufixed128x19
和 fixed128x19
的别名。
但是当前版本的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.
, .2
和 1.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, 即在常量运算中不会改变精度和调整数值范围。
感谢您对本文的关注,如果您对区块链技术有兴趣,可以加入我们一起探讨, 请扫码关注“可可链”的微信公众号,并留言“加入可可链”。
本文欢迎转载,转载时请注明本文来自 微信公众号“可可链”。