使用方法
- 先填两个几何量。面积按平方米填,厚度按厘米填,两者单位不同,页面先把厘米除以 100 换成米再相乘。默认样本已填 10 m² 与 10 cm,打开即见分步结果,不必自己先想例子。
- 再填两个包装量。每袋容量按包装升数填,常见 20 L;松散系数默认 1.15,估计翻松、沉降与边角损耗的富余,可在 1 到 2 间按土质微调,填 1 即不计富余。
- 两种触发方式。四个数字框按回车立刻计算,五张卡片同步刷新;面积清单是多行文本框,按 Ctrl/Cmd + Enter 把每段面积分别换成整袋数并汇总,支持空格、逗号或换行分隔。
- 区分中间量与采购量。结果区用 role="alert" 标注,把理论体积、理论袋数、乘系数、向上取整四步逐行列出,读屏软件整段播报;只有最后那个整数能直接抄进购物车。
- 核对与导出。对照表默认 12 行,点「加载更多」再展开 2 行;导出 CSV 带 BOM、复制对照表按 TSV 分列。字段留空或超范围时红框写明字段与范围,不会偷偷当成 0。
这个工具能解决什么问题
一是把「买几袋土」从拍脑袋变成可复算的四步。花坛翻土、屋顶花园铺基质、育苗盘填土,商家按袋卖、按升标,园丁却按平方米和厘米想,中间隔着体积换算与包装规格两道坎。少买一袋要补单多跑一趟,多买几袋受潮结块还占阳台,本页把两道坎一次算清并把每一步中间值都摊开。
二是纠正「理论体积直接除以每袋升数」这个最常见的低估。袋装土标的是装袋体积,倒出翻松后孔隙变大,铺好又被踩实、浇水沉降,边角还有损耗,实际用量通常更多。页面把这份富余显式写成 1.15 的系数,而不是让人凭经验在心里加一点,换个人、换个季节重算口径仍一致。
三是给出「整袋」这个真正的采购口径。57.5 袋在表格里合理,在下单页面里没有意义;向上取整到 58 袋才可用,同时报出每袋在 10 cm 厚下覆盖 0.2 m²,方便反推零星补土或核对整袋数乘覆盖面积是否盖得住花圃。有些旧目录把本页记作 GardenSoil计算器,指的仍是同一套面积乘厚度的算法。本页不区分营养土与泥炭配比,也不估算单价运费。
原理和变量:理论体积、松散系数与整袋取整
第一步,面积乘厚度得体积,但两个输入单位并不相同。面积是 m²,厚度是 cm,必须先把厚度除以 100 换成米再相乘:V = A × (d / 100),单位 m³。10 m² × 10 cm 就是 10 × 0.1 = 1 m³。很多人直接把 10 乘 10 当成 100 m³,差了整整两个数量级,根源就是漏掉厘米到米这道换算;本页把它固定写进公式,不依赖使用者记得换单位。
第二步,把体积换成袋数。1 m³ = 1000 L,理论袋数 N = V × 1000 / B,B 是每袋升数。1 m³ 除以 20 L/袋得 50 袋。这一步算出的是「压实体积」下的理论值,隐含假设是土壤铺好后体积不增不减,而真实花园里并不成立,所以不能直接拿去下单。
第三步,乘松散系数,这是整条链路的核心。袋装土经搬运、倾倒、翻松,颗粒间孔隙增加;铺好后又因浇水踩踏沉降,边角还有损耗,实际用量普遍高于理论值。本页用 L(默认 1.15,可调 1 到 2)统一表示富余:N′ = N × L,即 50 × 1.15 = 57.5 袋。它单独占一张结果卡片而不合并到最后一步,正因为最容易被省略、最容易造成「买少了」。系数不是国标定值,黏重土取小、疏松基质取大,关键是显式写出来、可复算。
第四步,向上取整成整袋。土壤按整袋销售,57.5 必须变成 58,用的是 Math.ceil 而不是四舍五入:哪怕只多出 0.1 袋也要多买一整袋才够铺满,向下取整会留一块没土的地,补买一袋的运费远超这点富余。本页对「乘系数后」与「向上取整后」分别给数,让你看清舍入发生在哪一步、多出那袋是系数还是取整造成的。
还有一个反向量:每袋覆盖面积。C = (B / 1000) / (d / 100),即每袋体积除以铺土厚度。20 L 是 0.02 m³,铺 0.1 m 厚覆盖 0.2 m²,与整袋数互为倒数,可交叉核对 58 袋乘 0.2 m² 约 11.6 m²,比目标 10 m² 略大,正好对应系数与取整叠加的富余。四个变量各有边界:面积 0.1~10000 m²、厚度 1~200 cm、每袋 1~100 L、系数 1~2,超出不是截断而是明确报错,避免无声偏差。
完整示例(默认样本实测)
默认样本是面积 10 m²、厚度 10 cm、每袋 20 L、松散系数 1.15,面积清单填了 10、20、30 三段。按四步逐项核对:
- 理论体积:10 × (10 ÷ 100) = m³;
- 理论袋数:1 × 1000 ÷ 20 = 袋;
- 乘松散系数后:50 × 1.15 = 袋;
- 向上取整:Math.ceil(57.5) = 袋;
- 每袋覆盖面积:0.02 ÷ 0.1 = m²。
五个位置里的数字不是写死在页面上的,而是加载时用自己的 calc 函数按同样四步算出再填入;改动输入框立即跟随重算,数值复算表里的 1、50、57.5、58、0.2 就是这样由脚本得到的,人工抄一遍反而容易与实时结果对不上。
面积清单 10、20、30 会另给三行整袋数与合计。分开算时每块地各自向上取整,三处小数余量各补一袋,合计通常比合并后只取整一次略多,这是整袋舍入的颗粒度效应,不是算错。
对照表与输入范围
表格列出 14 组面积与厚度组合,前 12 行可见,后 2 行点「加载更多」展开。每组都调用同一个 calc 函数,按当前每袋升数与松散系数算出四列,所以不是印死的速查表:把每袋容量改成 25、或把系数改成 1.3,全表立即重算。第一组 10 m² × 10 cm 与完整示例同参数,是整张表的锚点,也是和数值复算表对照的入口;其余组合覆盖小面积厚铺、大面积薄铺与极小面积等边界,方便观察厚度翻倍时整袋数是否近似翻倍。
- 面积:0.1~10000 m²,步长 0.1,适合阳台花箱到整片庭院。
- 厚度:1~200 cm,步长 1,内部统一除以 100 换成米。
- 每袋升数:1~100 L,步长 1,按包装标注填写。
- 松散系数:1~2,步长 0.01,填 1 即退化为不计富余。
两个按钮从同一份计算结果生成数据:导出 CSV 带 UTF-8 BOM,Excel 打开中文表头不乱码;复制对照表按 TSV 送进剪贴板自动分列,屏幕所见与导出所得永远一致。
结果边界与舍入
- 只向上取整,不四舍五入。整袋数用 Math.ceil,57.0001 也变 58。「不够」要留空地加补单,「多一袋」只是占角落,两者不对称,取整方向固定向上。
- 中间量保留四位小数再展示。先 toFixed(4) 再用 parseFloat 去掉尾零,既避免无限小数刷屏,也不把 57.5 写成 57.5000;整袋数是整数、覆盖是一位小数,各自按原值显示。
- 系数等于 1 时退化。乘系数后袋数与理论袋数相同,只剩最后一次向上取整,可直观看到「不设富余」会少买多少。
- 极小与极大输入。面积很小或铺得很薄时理论袋数可能不到 1,向上取整仍得 1 袋,这是合理下限;很大时袋数线性增长,不做上限截断,但超出字段上限会先报错。
- 非法输入不静默归零。留空、字母、负数、超范围都会在红框写明字段、当前值与范围,计算当场中止;清单里的非正数也指出第几项。数值只在本地计算,无网络请求,也不写 Cookie 或 localStorage。
常见问题
为什么 10 乘 10 不是 100 立方米?
厚度单位是厘米,公式先把 10 cm 除以 100 换成 0.1 m,再用 10 m² 乘 0.1 m 得 1 m³。漏掉这一步会放大一百倍,是这类计算最常见的错。
50 袋为什么最后变成 58 袋?
50 是理论袋数,乘 1.15 系数得 57.5,再因整袋销售向上取整到 58。中间两步都在结果区单独列出,方便核对差额来自哪里。
松散系数 1.15 是标准值吗?
不是国标,只是常见经验富余。黏重压实园土可取接近 1 的值,疏松泥炭基质可取更大,范围 1 到 2 按现场情况定。
每袋升数该填 20 还是 25?
按包装标注的实际升数填。不同品牌规格差别大,填小了总袋数算多、填大了算少,它整体缩放第二步结果,最该照实填。
四舍五入到 57 袋不行吗?
不行。57.5 袋还差半袋才铺满,向下取整会留一块空地。商家不卖半袋,任何小数余量都得补一整袋,所以固定用 Math.ceil。
每袋覆盖 0.2 m² 是怎么来的?
20 L 等于 0.02 m³,铺 0.1 m 厚时覆盖 0.02 除以 0.1 得 0.2 m²。它是每袋体积与厚度的商,厚度一改就跟着变。
清单分三段算,合计为什么比一次算多?
每段各自向上取整,三处小数余量各补了一袋。合并成一段只取整一次就没有叠加,这是整袋舍入的颗粒度效应,不是算错。
我填的面积会被上传吗?
不会。计算全在当前浏览器完成,页面不发起网络请求,也不写 Cookie 或 localStorage,Network 面板始终是空的。