XSD 内置数值类型一共 19 个,但真实项目里真正常用、永远不会出错的就只有下面这 7 个,直接背下来就够你打遍天下。
| 优先级 | 类型名称 | 取值范围(大概) | 典型业务场景 | 推荐指数 & 说明 |
|---|---|---|---|---|
| 1 | xs:integer | …-2、-1、0、1、2…(理论无限大) | 数量、年龄、排序、ID(最万能王) | 5 stars 所有整数场景 100% 用这个! |
| 2 | xs:positiveInteger | 1、2、3…(大于 0) | 数量、件数、排名、页码 | 5 stars 只要不能是 0 或负数,就用它 |
| 3 | xs:nonNegativeInteger | 0、1、2、3…(大于等于 0) | 库存、点击量、年龄、页码 | 5 stars 超级常用 |
| 4 | xs:int | -2147483648 ~ 2147483647(32位有符号) | Java int、MySQL int 对应 | 4 stars 需要和后端严格对齐时用 |
| 5 | xs:long | -9223372036854775808 ~ 9223372036854775807(64位) | Java long、订单号、雪花ID | 4 stars 超大整数用这个 |
| 6 | xs:decimal | 任意精度小数(如 99.99、0.001、1000000.000) | 价格、金额、重量、经纬度(终极王者) | 5 stars 所有带小数的场景永远只用 decimal!绝不要用 float/double |
| 7 | xs:double | IEEE 754 双精度浮点(会有精度丢失) | 科学计算、图表、极少金额场景 | 1 star 永远不要用于金额! |
真实项目终极推荐表(直接复制进项目,永不出错)
| 业务字段 | 永远写这个类型 | 推荐额外限制(facet) | 示例值 |
|---|---|---|---|
| 商品数量、库存、件数 | xs:positiveInteger | minInclusive=”1″ maxInclusive=”999999″ | 1、99、1000 |
| 年龄 | xs:nonNegativeInteger | maxInclusive=”150″ | 0 ~ 150 |
| 排序值、优先级 | xs:nonNegativeInteger | — | 0、1、999 |
| 用户ID、订单ID(数据库bigint) | xs:long | minInclusive=”1″ | 2839471293847123 |
| 商品价格、订单金额 | xs:decimal | totalDigits=”12″ fractionalDigits=”2″ | 99.99、1999.00、0.01 |
| 重量、尺寸、面积 | xs:decimal | totalDigits=”10″ fractionalDigits=”3″ | 1.250、999.999 |
| 经纬度 | xs:decimal | totalDigits=”10″ fractionalDigits=”6″ | 39.904989、116.405289 |
| 折扣、比例、百分比 | xs:decimal | minInclusive=”0″ maxInclusive=”1″ fractionalDigits=”4″ | 0.9500、1.0000 |
| 评分(1~5星) | xs:decimal 或 positiveInteger | minInclusive=”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 模板吗?秒发!