在以太坊智能合约开发中,Solidity 语言为我们提供了多种数据类型来处理不同范围和精度的数值。fixed 类型系列,即固定点数类型,是一个相对不那么为人熟知但功能强大的工具,本文将深入探讨以太坊(更准确地说是 Solidity)中的 fixed 类型,揭示其工作原理、应用场景以及开发者在使用时需要注意的事项。

什么是 fixed 类型

fixed 类型是 Solidity 中用于表示有理数(即可以表示为两个整数之比的数)的一种数值类型,与计算机中常用的浮点数(floatdouble)不同,fixed 类型采用固定小数位数的方式存储数值,这意味着其小数部分的位数是预先定义且固定的。

fixed 类型的一般形式为 fixedMxN

  • M 表示总共使用的位数(bit width),可以是 8256 之间的 8 的倍数(即 8, 16, 24, ..., 256)。
  • N 表示小数部分的位数(number of fractional digits),可以是 0M 之间的整数。
  • fixed128x18:表示总共使用 128 位,18 位是小数部分,110 位是整数部分(128 - 18)。
  • fixed64x32:表示总共使用 64 位,32 位是小数部分,32 位是整数部分。
  • fixed:这是 fixed128x18 的别名,是 fixed 类型中最常用的,类似于 intint256 的别名。

fixed 类型的核心特性

  1. 固定精度:这是 fixed 类型最核心的特性,一旦选择了 MN,数值的精度就确定了,这对于需要精确计算的场景至关重要,避免了浮点数运算中常见的精度误差累积问题,在金融计算中,0.01 美元的误差可能是不可接受的。

  2. 确定性:由于精度固定,fixed 类型的运算结果是确定性的,这在区块链这种强调确定性和一致性的环境中尤为重要,浮点数运算由于 IEEE 754 标准的实现细节和硬件差异,可能会在不同环境下产生微小差异,这在智能合约中是危险的。

  3. 范围限制fixed 类型的取值范围由其总位数 M 和符号决定(有 ufixed 表示无符号固定点数,如 ufixed128x18;以及 fixed 表示有符号固定点数)。fixed128x18 的整数部分范围是 -2^1272^127 - 1,小数部分可以表示 1 / 10^18 的精度。

  4. 存储与运算:在 Solidity 中,随机配图