调用 JDKInstant.toEpochMilli()可能会导致算术上溢/下溢(例如Instant.MAX.toEpochMilli()或Instant.MIN.toEpochMilli())。我正在寻找一种避免算术溢出的简单方法,只需使用Long.MAX_VALUE. 这是我当前的代码。
long seconds, millis;
seconds = deadline.getEpochSecond();
if (seconds > Long.MAX_VALUE / 1000 - 1)
millis = Long.MAX_VALUE;
else if (seconds < Long.MIN_VALUE / 1000 + 1)
millis = Long.MIN_VALUE;
else
millis = deadline.toEpochMilli();
Run Code Online (Sandbox Code Playgroud)
似乎必须有一种更清晰/更清晰的方法来实现这一点。你将如何实现这个逻辑?
我必须关心上溢/下溢,因为Instant.MAX和Instant.MIN被传递给此代码所在的方法。
我知道以前也有人问过类似的问题,但我认为我的情况略有不同。我有一个具有对数值的列,我正在尝试使用以下公式反转它们:
SELECT POWER(10,CAST(9.695262723 AS NUMERIC(30,15)))
假设该值9.695262723是该列的值之一。尝试运行此查询时,我得到一个Arithmetic overflow error for type int, value = 4957500001.400178.
另一方面,相同的查询适用于较小的值,例如 SELECT POWER(10,CAST(8.662644523 AS NUMERIC(30,15)))
我如何克服该错误并计算我拥有的 log10 条目的倒数值?仅供参考,表中存在的较大值(以 log10 为单位)是12.27256096。
我收到此错误,但仅在按特定列分组时出现:
Arithmetic overflow error converting expression to data type int.
Run Code Online (Sandbox Code Playgroud)
我无法理解为什么。这是导致它的查询(总和函数是罪魁祸首):
SELECT a.AtgardAvvattningId,
a.ObjektId,
sum(p.SlutLopLangd - p.StartLopLangd) As TotalLangd
FROM AtgardAvvattning a
INNER JOIN Objekt o ON o.ObjektId = a.ObjektId
INNER JOIN Position p ON p.AvvattningAtgardId = a.AtgardAvvattningId
INNER JOIN Vna v ON v.PositionId = p.PositionId
WHERE v.OID IN (...)
GROUP BY a.AtgardAvvattningId, a.ObjektId, o.AtgardsDatum
ORDER BY a.ObjektId
Run Code Online (Sandbox Code Playgroud)
p.SlutLopLangd 和 p.StartLopLangd 都是 int 列。如果我在求和之前将值转换为 bigint,它会起作用:
sum(CONVERT(bigint, p.SlutLopLangd - p.StartLopLangd)) As TotalLangd
Run Code Online (Sandbox Code Playgroud)
给出这个结果:
| AtgardAvvattningId | 对象ID | 总面积 |
|---|---|---|
| 直流9... | 9B2... | 25684 |
| 儿童早期发展... | 9B2... … |