🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 小数 ## 定点数 //文档上称,暂不支持 ## 小数字面量 如果字面量计算的结果不是一个整数,那么将会转换为一个对应的`ufixed`,或`fixed`类型。`Solidity`会选择合适的大小,以能尽量包含小数部分。 例,在`var x = 1 / 4`中,`x`的实际类型是`ufixed0x8`。而在`var x = 1/ 3`中,类型会是`ufixedox256`,因为这个结果表示是无限的,所以他只能是无限接近。 ## 支持的运算符 适用于整型的操作符,同时适用于数字的字面量运算表达式,当操作结果是整数时。如果有任何一方是有理数,将不允许使用位操作符。如果指数是小数,还将不能进行取幂运算。 ## 数字字面量 Solidity对每一个有理数都有一个数值字面量类型。整数字面量和有理数字面量从属于数字面量。所有的数字字面表式的结果都属于数字字面类型。所以`1 + 2`和`2 + 1`都属于同样的有理数的数字字面类型`3` ## 二进制表示 大多数含小数的十进制,均不可被二进制准确表达,比如`5.3743`的类型可能是`ufixed8*248`。如果你想使用这样的值,需要明确指定精度`x + ufixed(5.3743)`,否则会报类型转换错误。 ## 字面量截断 整数上的字面量除法,在早期的版本中是被截断的,但现在可以被转为有理数了,如`5 /2`的值为 `2.5`。 ## 字面量转换 数字的字面量表达式,一旦其中含有非字面量表达式,它就会被转为一个非字面量类型。下面代码中表达式的结果将会被认为是一个有理数: ``` pragma solidity ^0.4.0; contract IntegerLiteralConvert{ function literalTest(){ uint128 a = 1; //uint128 b = 2.5 + a + 0.5; //Error: Operator + not compatible with types rational_const 5/2 and uint128 } } ``` 虽然我们知道上述表达式运算的结果将是一个整型,但最终被编译器认为是小数型,所以上述代码编译不能通过。