对于任何 |value| ≥ 2^63 的 FLOAT, round() 返回 9.223372036854776E18 (2^63)
Neo4j 版本: 2026.07.1
安装方法: Docker
API: Cypher (Bolt / cypher-shell)
### 可重现的步骤
1. 在新的数据库上,运行:cypher<br />RETURN round(1.0E308) AS r1,<br /> round(1.0E19) AS r2,<br /> round(9.3E18) AS r3,<br /> round(-1.0E308) AS r4,<br /> round(1.0E308, 0) AS r5,<br /> round(1.0E308, 0, 'HALF_UP') AS r6,<br /> round(1.0E308) = round(1.0E308, 0, 'HALF_UP') AS r7<br />
### 预期行为
- round(1.0E308) → 1.0E308
- round(1.0E19) → 1.0E19
- round(9.3E18) → 9.3E18
- round(-1.0E308) → -1.0E308
- round(1.0E308, 0) → 1.0E308
- round(1.0E308) = round(1.0E308, 0, 'HALF_UP') → true(它们是相同的逻辑操作;round(1.0E308, 0, 'HALF_UP') 已正确返回 1.0E308)
### 实际行为
- round(1.0E308) → 9.223372036854776E18(偏离了约 290 个数量级)
- round(1.0E19) → 9.223372036854776E18
- round(9.3E18) → 9.223372036854776E18
- round(-1.0E308) → -9.223372036854776E18
- round(1.0E308, 0) → 9.223372036854776E18
- round(9.2E18) → 9.2E18(正确 — 小于 2^63 阈值)
- round(1.0E19, 1) / round(1.0E19, 0, 'HALF_UP') / round(1.0E19, 1, 'HALF_UP') → 正确(1.0E19)
- round(1.0E308) = round(1.0E308, 0, 'HALF_UP') → false
为了进行比较,相同输入 1.0E308 由其他所有四舍五入函数和所有显式模式的 round() 正确处理:
| 表达式 | 结果 |
|---|---|
| ceil(1.0E308) | 1.0E308 |
| floor(1.0E308) | 1.0E308 |
| round(1.0E308, 0, 'UP') | 1.0E308 |
| round(1.0E308, 0, 'DOWN') | 1.0E308 |
| round(1.0E308, 0, 'HALF_UP') | 1.0E308 |
内容来源: neo4j/neo4j