XSD 数值数据类型

XSD 内置数值类型一共 19 个,但真实项目里真正常用、永远不会出错的就只有下面这 7 个,直接背下来就够你打遍天下。

优先级类型名称取值范围(大概)典型业务场景推荐指数 & 说明
1xs:integer…-2、-1、0、1、2…(理论无限大)数量、年龄、排序、ID(最万能王)5 stars 所有整数场景 100% 用这个!
2xs:positiveInteger1、2、3…(大于 0)数量、件数、排名、页码5 stars 只要不能是 0 或负数,就用它
3xs:nonNegativeInteger0、1、2、3…(大于等于 0)库存、点击量、年龄、页码5 stars 超级常用
4xs:int-2147483648 ~ 2147483647(32位有符号)Java int、MySQL int 对应4 stars 需要和后端严格对齐时用
5xs:long-9223372036854775808 ~ 9223372036854775807(64位)Java long、订单号、雪花ID4 stars 超大整数用这个
6xs:decimal任意精度小数(如 99.99、0.001、1000000.000)价格、金额、重量、经纬度(终极王者)5 stars 所有带小数的场景永远只用 decimal!绝不要用 float/double
7xs:doubleIEEE 754 双精度浮点(会有精度丢失)科学计算、图表、极少金额场景1 star 永远不要用于金额!

真实项目终极推荐表(直接复制进项目,永不出错)

业务字段永远写这个类型推荐额外限制(facet)示例值
商品数量、库存、件数xs:positiveIntegerminInclusive=”1″ maxInclusive=”999999″1、99、1000
年龄xs:nonNegativeIntegermaxInclusive=”150″0 ~ 150
排序值、优先级xs:nonNegativeInteger0、1、999
用户ID、订单ID(数据库bigint)xs:longminInclusive=”1″2839471293847123
商品价格、订单金额xs:decimaltotalDigits=”12″ fractionalDigits=”2″99.99、1999.00、0.01
重量、尺寸、面积xs:decimaltotalDigits=”10″ fractionalDigits=”3″1.250、999.999
经纬度xs:decimaltotalDigits=”10″ fractionalDigits=”6″39.904989、116.405289
折扣、比例、百分比xs:decimalminInclusive=”0″ maxInclusive=”1″ fractionalDigits=”4″0.9500、1.0000
评分(1~5星)xs:decimal 或 positiveIntegerminInclusive=”1″ maxInclusive=”5″ fractionalDigits=”1″4.5、5.0

实战写法大全(直接复制)

<!-- 1. 商品数量(最标准) -->
<xs:element name="quantity" type="xs:positiveInteger"/>

<!-- 2. 库存(允许 0) -->
<xs:element name="stock">
  <xs:simpleType>
    <xs:restriction base="xs:nonNegativeInteger">
      <xs:maxInclusive value="999999"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

<!-- 3. 价格金额(所有电商、支付、财务系统永远只写这几行) -->
<xs:simpleType name="Money">
  <xs:restriction base="xs:decimal">
    <xs:totalDigits value="14"/>      <!-- 整数位最多12位 -->
    <xs:fractionDigits value="2"/>    <!-- 固定2位小数 -->
    <xs:minInclusive value="0"/>
  </xs:restriction>
</xs:simpleType>

<!-- 4. 订单总金额(允许 0.00) -->
<xs:element name="totalAmount" type="Money"/>

<!-- 5. 经纬度 -->
<xs:simpleType name="Coordinate">
  <xs:restriction base="xs:decimal">
    <xs:fractionDigits value="6"/>
    <xs:minInclusive value="-90"/>
    <xs:maxInclusive value="180"/>
  </xs:restriction>
</xs:simpleType>

<!-- 6. 雪花ID / 分布式ID(64位) -->
<xs:element name="orderId" type="xs:long"/>

<!-- 7. 折扣率(0.00 ~ 1.00) -->
<xs:simpleType name="DiscountRate">
  <xs:restriction base="xs:decimal">
    <xs:fractionDigits value="4"/>
    <xs:minInclusive value="0"/>
    <xs:maxInclusive value="1"/>
  </xs:restriction>
</xs:simpleType>

永远不要犯的错 vs 正确做法

错误写法为什么错正确写法
金额会有精度丢失(0.1 + 0.2 ≠ 0.3)永远用 xs:decimal
价格同上,更严重永远用 xs:decimal
订单号(超 21 亿)会溢出用 xs:long 或 xs:integer
库存允许负数业务不允许用 xs:nonNegativeInteger
直接用 xs:decimal 不限制小数位可能出现 99.999999999必须加 fractionDigits=”2″

一句话总结(贴在工位上)

所有整数 → xs:integer / positiveInteger / nonNegativeInteger
所有小数 → xs:decimal(永远固定 fractionDigits=”2″ 或 “4”)
永远不要在业务系统中使用 xs:float、xs:double 来表示钱!

需要我直接甩你一套「电商订单」「商品规格」「财务对账」三套最标准的数值字段 XSD 模板吗?秒发!

文章已创建 2838

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部