露点计算器

输入气温与相对湿度,按 Magnus-Tetens 公式(a=17.625、b=243.12)解出露点温度,同屏并排给出 tools.json 里那条简化式 t-(100-h)/5 的结果与两者差值。数值仅作演示。

当前按 25 °C / 60 %RH 计算,露点 16.7 °C。

露点温度(Magnus-Tetens,主口径)16.7 °C
简化式 t-(100-h)/5 的结果17.0 °C
两式差(简化式 − 主口径)+0.3 °C
25 °C 饱和水汽压 es31.62 hPa
当前实际水汽压 = es × RH18.97 hPa
湿球温度(Stull 2011,交叉校验)19.50 °C
合理性自检:露点 16.70 °C ≤ 湿球 19.50 °C ≤ 气温 25.0 °C。若出现「露点 > 气温」或「露点 > 湿球」,说明输入被读错了。

使用方法

  1. 在「气温 t」填摄氏温度,范围 −60 ~ 60,步进 0.5(示例 25)。
  2. 在「相对湿度 RH」填百分比,范围 1 ~ 100,步进 0.5(示例 60)。下限是 1 不是 0,原因见「边界与精度」第 3 条。
  3. 点「计算露点」。两个框都是单行输入框,直接按 Enter 就能算,不用去点按钮。
  4. 结果区同时给出六个值:主口径露点、简化式结果、两者差、饱和水汽压、实际水汽压、湿球温度。默认这组 25 °C / 60 %RH 的结果是 16.7 °C。
  5. 要还原初始状态点「载入示例」;要把结论带走点「复制结果」;想核对不同温湿组合点「导出 CSV」拿到 12 行对照表。

这个露点计算器能解决什么问题

一是判断会不会结露。露点是空气里水汽开始凝结的温度,屋面、玻璃、金属管道的温度一旦低于它,表面就会出现水珠。做暖通、涂装、仓储温湿度记录时,「气温 24 °C、湿度 65 %RH」这类数据必须先换算才知道风险,而 24 °C / 65 %RH 的露点是 17.0 °C,比气温低 7.0 °C。

二是核对数据源里那条简化式靠不靠谱。本页把 tools.json 登记的表达式 t-(100-h)/5 与 Magnus 主口径并排输出,你一眼能看出它在什么工况下偏了多少。实测结论是:25 °C / 60 %RH 处两者只差 0.30 °C,看起来没问题;但在 60 °C / 5 %RH 这种高温干燥工况下,简化式会偏高 34.0 °C,直接拿它做除湿量估算会算错一个量级。

三是做传感器数据的合理性校验。温湿度记录仪偶尔会跳出明显不合理的组合(湿度 100 % 而露点远低于气温)。把两组数各存一列,跑一遍本页,若出现「露点 > 气温」就说明那一行至少有一个字段是错的。

四是理解为什么「相对湿度」不能当「含水量」看。同一种湿度在不同温度下对应的实际水汽压完全不同:25 °C / 60 %RH 的实际水汽压是 18.97 hPa,而 0 °C / 60 %RH 只有 3.67 hPa(es(0 °C) = 6.112 hPa × 0.6),相差 5.17 倍——因为饱和水汽压本身随温度指数增长,0 → 25 °C 期间 es 从 6.11 涨到 31.62 hPa。

本页不做这些事:不输入湿球温度(湿球只作为校验值出现在结果区,Stull 2011 是近似式,湿球反推露点在低温下误差大)、不做分段结露判据(ASHRAE 的「凝露露点」需要在材料热阻上再算一层)、不接入实测数据。如果你要的是从已知露点反推相对湿度,请用 相对湿度计算器;要看热量摄入与气温无关的静态数值,用 卡路里计算器。

原理和变量

主口径用 Magnus-Tetens 公式。设饱和水汽压为 es(T) = 6.112 × exp(a·T / (b+T))(单位 hPa),露点 Td 就是使 es(Td) = (RH/100) × es(T) 成立的温度。把它解成显式表达式,只需要中间量 γ:

γ = a·T / (b+T) + ln(RH/100),然后 Td = b·γ / (a − γ)。常数取 a = 17.625、b = 243.12,出自 Alduchov 与 Eskridge 1996 年对 Magnus 公式的改进(适用于水面、相对湿度 ≥ 7 %)。这两个常数写死在代码里、不做成输入框,因为它们是文献常数不是用户参数;放开让人改反而会让不同人得到不同结果却以为是同一个公式。

为什么不用另一套常见的 Tetens 1930 系数(a = 17.27、b = 237.7)?因为两套在实用区间内几乎重合:实测 −30 ~ 50 °C、RH 7 ~ 100 % 网格上两者最大分歧 0.26 °C,出现在 −30 °C / 7 %RH 这个极端角;而在默认示例 25 °C / 60 %RH 处两者只差 0.011 °C,远低于本页 0.1 °C 的显示分辨率。也就是说选哪套都不影响本页显示的每一位,选 A/E 只是因为它同时给出了对低湿度的适用下限。

湿球温度用 Stull 2011 的经验式 Tp = t·atan(0.151977·√(RH+8.313659)) + atan(t+RH) − atan(RH−1.676331) + 0.00391838·RH^1.5·atan(0.023101·RH) − 4.686035。它在湿球处不要求输入温度,误差约 0.4 °C,本页只把它当上界校验用,不参与主结果。

结果区那一格「反解相对湿度」是本页的自校验:把算出的 Td 代回 RH = 100 × exp(a·Td/(b+Td) − a·T/(b+T)),如果回到的 RH 与你输入的 RH 一致,说明整个链条没算错。实测在 t −60 ~ 60 °C、RH 1 ~ 100 的整数网格上,最大往返偏差是 2.13 × 10⁻¹³ %RH——这是 Math.log / Math.exp 的双精度极限,再多也没有意义。

完整示例

默认这组:气温 25.0 °C、相对湿度 60.0 %(数值仅作演示)。

换一组验证:20 °C / 50 %RH 露点 9.3 °C、35 °C / 90 %RH 露点 33.1 °C、0 °C / 40 %RH 露点 −12.0 °C。这三行和下面表格里的对应行是同一组数,可以逐位对照。

输入范围与对照表

两个输入框的约束:气温 min="-60" max="60" step="0.5",相对湿度 min="1" max="100" step="0.5"。超出范围会直接拒绝并说明允许区间,不会被静默截断成边界值。

气温 (°C)相对湿度 (%)露点 (°C)简化式 (°C)简化式 − 主口径 (°C)湿球 (°C)反解 RH (%)

下面 12 行是固定的对照样本,覆盖负温、零度、闰日附近的常温与高湿工况。每行的「露点」列就是主口径结果,「简化式 − 主口径」为正表示简化式偏高。点「加载更多行」会追加 12 行,共 24 行上限。

几个容易搞混的对照:

边界与精度

1. 相对湿度下限为什么是 1 而不是 0。主公式里有 ln(RH/100)。RH 传 0 时 Math.log(0) 返回 -Infinity,往后算全是 NaN,页面会变成空白而不是报错。所以湿度下限设 1;<input> 上写 min="1" 只是辅助,真正拦得住的是 JS 里的逐字段 fail()。

2. 气温下限为什么是 −60。公式另一处是 a·T/(b+T),分母 b+T 在 T = −243.12 处为 0。理论上 −243.12 以下才有奇异点,但气象观测的常规下限是 −60 °C,继续往下的输入没有任何现实对应物。取 −60 时分母是 183.12,离 0 还很远;取 +60 时分母是 303.12,a − γ 的最小值(全网格枚举)仍有 14.136,所以分子分母都不会接近 0。

3. 露点可能远低于气温,这是对的。在 −60 ~ 60 °C、RH 1 ~ 100 % 全网格上,露点的实际取值范围是 −90.1 °C(出现在 −60 °C / 1 %RH)到 60.0 °C。所以本工具不对「露点 < −60」报错——那是合法结果,露点本身没有 −60 的物理下限。

4. 简化式的误差方向会翻转。实测 −40 ~ 60 °C、RH 5 ~ 100 % 网格上,简化式的最大绝对误差是 34.0 °C,出现在 60 °C / 5 %RH。误差随温度升高而变大(60 °C / 20 %RH 时偏高 13.1 °C),但在低温区方向相反(−20 °C / 60 %RH 时偏低 2.2 °C)。所以不能用一句「简化式偏低」概括。

5. 系数选错的后果是量级错误。网上流传的 a=17.625, b=230.97 并不是 Magnus 系数。用它算 25 °C 的饱和水汽压得 34.18 hPa,而真值是 31.68 hPa,偏高 7.89 %——代入露点公式后误差会再放大。本页固定 b = 243.12 就是为了避开这个坑。

6. 显示精度固定 1 位小数。公式本身的误差远小于 0.1 °C(主口径与 Tetens 只差 0.011 °C),多给位数是虚假精度。所以输出统一 toFixed(1),25 °C / 60 %RH → 16.7,20 °C / 50 %RH → 9.3,35 °C / 90 %RH → 33.1。

常见问题

25 °C / 60 %RH 的露点为什么是 16.7 而不是 17.0?两个数到底哪个对?

16.7 是本页主口径(Magnus-Tetens,a=17.625 / b=243.12)的结果,17.0 是 tools.json 里登记的简化式 t-(100-h)/5 的结果。16.7 接近真实值,17.0 偏高约 0.3 °C。之所以两个都给你看,是想让你知道这条简化式在常温常湿下误差很小、容易让人放心,但它在高温干燥下会偏到 34 °C。判断该不该用简化式,看的是工况而不是这两行的差值大小。

为什么相对湿度不能设成 0?我明明在沙漠里测到过 2 %RH。

2 % 是完全合法的,本页下限取 1 就能正常算。但 0 % 在数学上是另一回事:公式要取 ln(0/100) = ln(0),而 Math.log(0) 在 JavaScript 里返回 -Infinity(不是抛错,也不是 0),后面每一步运算都会被这个无穷污染成 NaN。如果照搬那些「用 if 特判 0」的写法,页面会在你输入 0 的瞬间显示一片空白且没有任何提示。本页的做法是直接拒绝并说明「相对湿度需在 1 ~ 100 之间」。

我把露点算成比气温还高,是不是算错了?

在合法的输入下不可能。全网格枚举(t −60 ~ 60 °C、RH 1 ~ 100 %,步进 0.5)实测「露点 − 气温」的最大值为 0.000000000 °C,出现在 RH = 100 % 时——此时露点精确等于气温。若你看到露点高于气温,那是输入被截断或读错了:确认湿度确实 ≤ 100,且气温用的是摄氏度而不是开尔文(1 K 的温差在这里会变成 1 °C 的偏差)。

湿度 100 % 时露点就等于气温,为什么还要单独算一遍?

因为这是公式的必然结果而不是巧合:ln(100/100) = ln(1) = 0,于是 γ = a·T/(b+T),代回 Td = b·γ/(a−γ) 化简后正好是 T。实测 RH = 100 % 时,0 / 10 / 20 / 30 / 40 °C 的露点分别精确等于 0 / 10 / 20 / 30 / 40 °C(9 位小数全为 0)。所以「100 %RH」在物理上意味着空气已饱和、水汽再多就成露水了。

CSV 导出的数字和页面上看到的一致吗?为什么直接用 Excel 打开不乱码?

一致,CSV 里的露点就是同一份代码算的同一个值,只多保留 1 位小数。之所以 Excel 打开不乱码,是因为文件开头写了 BOM(\ufeff,3 个字节的 EF BB BF)。Excel 需要 BOM 才会把 CSV 当 UTF-8 读,没有它就会用本地代码页,中文表头会变乱码。对照表固定 12 行、6 列,含 BOM 约 392 字节,行尾用 CRLF 以兼容 Excel。

我的传感器湿度长期在 99 %~100 % 跳,露点算出来却比室温低好几度,正常吗?

正常,而且这正是本页要帮你发现的问题。当湿度接近饱和时,露点对湿度的敏感度会剧烈变化:25 °C 下湿度从 60 % 升到 61 %,露点只从 16.7 变到 17.0 °C(仅 0.26 °C);而从 95 % 升到 100 %,露点从 24.1 变到 25.0 °C(0.86 °C)——看着数值也小,但它已经贴住气温了,余量只剩 0 °C。反过来说,露点落在 24 °C 而气温是 25 °C,意味着湿度已在 95 % 附近,离结露只有 1 °C 的余量。如果这与你的现场观察不符,先怀疑湿度通道标定。

这个露点计算器和相对湿度计算器该怎么配合用?

方向相反:已知气温和湿度求露点,用本页;已知气温和露点求湿度,用相对湿度计算器。实际排查时常常是循环的——先用本页把温湿度记录转成露点时间序列,看夜里峰值离室温有多近;再发现某个露点反解出来的湿度不合理,就用相对湿度页复核那两列原始数据。本页结果区最后那格「反解 RH」就是把这个回路的一半直接算给你看。

露点能直接拿去算除湿量吗?

不能直接算,差一层。含湿量 g(g/kg 干空气)与露点不是一一对应的:同一露点下,干空气量不同则 g 不同。正确路径是「露点 → 饱和水汽压 es(Td)(这页已给) → 配合干球温度求湿空气焓 → 再由风量算除湿量」。本页输出里那个「实际水汽压 = es × RH」只是当前温湿度下的部分水汽压分压,不是焓,也不是含湿量。要做除湿选型请以厂商给出的焓湿图为准。

相关工具