超市囤货比价
周末去超市前,想囤一提卷纸和两瓶洗衣液。卷纸有 12 卷装 29.9 元和 20 卷装 45 元,洗衣液有 1L 装 19.9 元和 2.5L 装 39.9 元。光看总价容易选错,用本工具分别算出每卷和每升的单价,发现大包装未必更划算——20 卷装每卷 2.25 元,比 12 卷装的 2.49 元便宜,但 2.5L 洗衣液每升 15.96 元,比 1L 装的 19.9 元省了近 4 元。决策有了明确依据,不再被“大包装一定省”的直觉误导。
标准单价:把每个商品的规格统一折算到同一标准单位,再算「每标准单位多少钱」。公式 = 实付价 ÷(件数 × 单规格折算到标准单位)。单价越低越划算。
单位换算:1 kg = 1000 g、1 L = 1000 ml、1 打 = 12 个、1 m = 100 cm = 1000 mm。如「1.5kg → 1500g」「12 瓶 × 500ml → 6000ml」自动折算。
促销叠加:勾选「折后实付」可填入打折/满减后的实际到手价,用实付价而非标价算单价——这才是买大包打折 vs 小包谁真划算的关键。
排名:标准单价最低者为最优、高亮置顶;表中「贵 X%」= 该商品相对最优商品的单价贵的百分比;卡片「比最贵省 X%」= 最优相对最贵省下的比例。
提示:单价最低≠一定要买——还要结合实际用量、保质期与是否囤得下。买大包更划算的前提是用得完不浪费。
超市里同一款洗衣液,3kg装标价39.9元,5kg装标价59.9元,哪个更划算?心算单价总在货架前卡壳。这个工具把不同包装、规格的售价统一折算成每克或每毫升单价,直接比出最便宜的那个。输入价格与含量,浏览器本地算完,数据不上传服务器。
周末去超市前,想囤一提卷纸和两瓶洗衣液。卷纸有 12 卷装 29.9 元和 20 卷装 45 元,洗衣液有 1L 装 19.9 元和 2.5L 装 39.9 元。光看总价容易选错,用本工具分别算出每卷和每升的单价,发现大包装未必更划算——20 卷装每卷 2.25 元,比 12 卷装的 2.49 元便宜,但 2.5L 洗衣液每升 15.96 元,比 1L 装的 19.9 元省了近 4 元。决策有了明确依据,不再被“大包装一定省”的直觉误导。
双十一凑满减,同一款坚果有 200g 小袋装和 500g 家庭装,小袋标价 9.9 元,家庭装 23.8 元。不仔细算会以为家庭装每克更便宜,但用工具一算,小袋每克 0.0495 元,家庭装每克 0.0476 元,确实家庭装略低,但只差 0.0019 元。于是果断买小袋凑单,避免为了省几分钱多囤吃不完的量。
家里猫粮快见底,网上同一品牌有 1.5kg 装 68 元和 6kg 装 228 元。按每公斤算,1.5kg 是 45.33 元,6kg 是 38 元,大包装每公斤省 7.33 元。但猫吃一个月只消耗 2kg,买 6kg 得吃三个月,担心开封后受潮。用工具算出单价后,再结合自家猫的食量,最后选了 1.5kg 装,虽然单价高,但避免了浪费。
常喝的手冲咖啡豆,A 店 227g 卖 88 元,B 店 340g 卖 128 元。光看总价以为 A 店便宜,用工具算出每克单价:A 店 0.388 元,B 店 0.376 元,B 店每克便宜 1.2 分。按每周消耗 50g 算,买 B 店一个月能省 2.4 元,一年省 28.8 元。虽然不多,但长期下来也是一笔小钱,而且 B 店烘焙日期更新鲜,果断下单 B 店。
给宝宝囤湿巾,一箱 12 包共 360 片卖 59.9 元,另一箱 8 包共 320 片卖 49.9 元。用工具算单片价格:第一箱每片 0.166 元,第二箱每片 0.156 元,第二箱每片便宜 1 分钱。虽然单片差不大,但按一天用 20 片算,一个月用 600 片,选第二箱每月省 6 元,一年省 72 元。而且第二箱包装小,开封后不易干,更实用。
| 维度 | 本工具 | 超市比价 App | 手工计算 |
|---|---|---|---|
| 数据输入 | 直接输入价格与克数/数量 | 需搜索商品条码或名称 | 用纸笔记录并手动除 |
| 计算速度 | 输入即出单价 | 需等待加载商品详情页 | 每项需单独按计算器 |
| 多规格对比 | 一次输入多组,结果并列显示 | 需来回切换商品页面 | 容易记错或漏算 |
| 精度与单位 | 自动识别克/毫升/个,保留两位小数 | 部分不显示单价或单位混乱 | 手动换算易出错 |
| 离线可用 | 纯浏览器,断网也能算 | 需联网加载商品库 | 完全离线但无辅助 |
| 输入 | 输出 | 说明 |
|---|---|---|
| 商品A:包装1,净含量500g,价格15元;包装2,净含量1kg,价格28元 | 包装1单价:30元/kg;包装2单价:28元/kg → 包装2更划算 | 常规:典型的两包装比价场景,验证基本单价计算和比较逻辑 |
| 商品B:包装1,净含量100ml,价格9.9元;包装2,净含量200ml,价格19.8元;包装3,净含量500ml,价格49.5元 | 包装1单价:99元/L;包装2单价:99元/L;包装3单价:99元/L → 三者单价相同 | 常规:多包装且单价完全一致,验证工具能正确识别无差异场景 |
| 商品C:包装1,净含量0g,价格10元 | 错误:净含量不能为0,请检查输入 | 边界:净含量为0的极端情况,验证工具对无效输入的拦截 |
| 商品D:包装1,净含量1kg,价格0元 | 包装1单价:0元/kg → 免费商品,注意是否为促销或输入错误 | 边界:价格为0的免费商品,验证工具能处理零值并给出合理提示 |
| 商品E:包装1,净含量10g,价格0.01元 | 包装1单价:1元/kg | 边界:极小净含量和极低价格,验证小数点精度处理(0.01元/10g = 0.001元/g = 1元/kg) |
| 商品F:包装1,净含量1kg,价格15元;包装2,净含量1.5kg,价格22元;包装3,净含量2kg,价格30元 | 包装1单价:15元/kg;包装2单价:14.67元/kg;包装3单价:15元/kg → 包装2最划算 | 易错:包装2单价不是整数,用户可能误以为大包装一定更便宜(包装3反而贵了) |
| 商品G:包装1,净含量500g,价格10元;包装2,净含量500ml,价格12元 | 无法直接比较:包装1为质量单位(g),包装2为体积单位(ml),需统一密度换算 | 易错:单位不一致(g vs ml),用户常忽略此差异,工具需明确提示不可直接比 |
| 商品H:包装1,净含量1kg,价格20元;包装2,净含量1kg,价格20元 | 包装1单价:20元/kg;包装2单价:20元/kg → 两者价格相同 | 易错:完全相同的输入,验证工具不产生重复计算或误报差异 |
1.规格单位不一致导致单价对比无效
输入「5 斤装 20 元」和「2 千克装 18 元」直接对比统一单位:5 斤 = 2500 克,2 千克 = 2000 克;或都换算成千克:2.5 kg vs 2 kg斤、千克、克、磅混用不换算,单价比较结果完全错误。工具只做数值运算,不自动换算单位,用户必须手动统一。
2.总价含优惠券/满减,未扣除即输入原价
商品标价 50 元,实际用券后 40 元,输入 50 元输入实际支付金额 40 元单价对比应基于实际到手价。输入标价会高估单价,导致决策偏差。工具无法自动识别优惠,用户需自行扣除。
3.多包装内含有赠品,未将赠品计入总规格
买一送一,输入「1 瓶 30 元」输入「2 瓶 30 元」(总规格 = 主品 + 赠品)赠品是实际可用的商品量,不计入规格会虚高单价。工具只认输入的数字,赠品必须手动合并到规格中。
4.规格单位用「个/只/片」但数量级不同
A 包装 10 片 5 元,B 包装 100 片 40 元,直接对比统一换算为「每片单价」:A 0.5 元/片,B 0.4 元/片工具只比较单价数值,不识别「片」与「片」是否同一规格。若 B 的「片」面积更大,需先换算成相同基准(如每克/每毫升)。
5.液体/膏体用体积 vs 重量混输
A 洗面奶 200 ml 30 元,B 洗面奶 200 g 35 元先查密度:若密度 ≈ 1 g/ml,可近似等同;否则统一为质量或体积再输入ml 和 g 是不同物理量,密度不同时直接比较无意义。工具不做单位换算,用户必须自行确认可比较性。
6.忽略包装本身重量(净含量 vs 毛重)
罐头毛重 500 g 标价 15 元,输入 500 g查看净含量(如 425 g),输入 425 g毛重包含包装、汤汁等不可食用部分,用毛重算单价会低估实际食品成本。应始终使用净含量。
7.将「每件单价」与「每套单价」混淆
6 罐装啤酒 30 元,输入「1 件 30 元」输入「6 罐 30 元」或「1 件(6 罐)30 元」但需在备注说明「件」在不同商品中数量定义不同(啤酒 6 罐/12 罐/24 罐)。工具无法理解语义,必须用具体数字描述规格。
单价 = 总价 ÷ 总净含量
总价包装总售价,单位元总净含量包装内商品总净含量,单位克或毫升单价每单位净含量的价格某品牌洗衣液有 500g 装售价 19.9 元,另有 1.2kg 装售价 39.8 元。500g 装单价 = 19.9 ÷ 500 = 0.0398 元/g;1.2kg 装单价 = 39.8 ÷ 1200 ≈ 0.0332 元/g。1.2kg 装单价更低,更划算。
5 种主流语言实现,复制即用:
from typing import List, Dict
def compare_unit_price(items: List[Dict]) -> List[Dict]:
"""
输入:[{"name":"A","total_price":29.9,"quantity":500,"unit":"g"}, ...]
输出:添加 unit_price 字段,按单价升序排列
"""
if not items:
return []
for item in items:
item['unit_price'] = round(item['total_price'] / item['quantity'], 4)
return sorted(items, key=lambda x: x['unit_price'])
# 示例:三款洗衣液,不同规格
products = [
{"name":"蓝月亮 500g", "total_price":29.9, "quantity":500, "unit":"g"},
{"name":"蓝月亮 1kg", "total_price":49.9, "quantity":1000, "unit":"g"},
{"name":"蓝月亮 3kg", "total_price":89.9, "quantity":3000, "unit":"g"},
]
result = compare_unit_price(products)
for r in result:
print(f"{r['name']}: 总价{r['total_price']}元, 数量{r['quantity']}{r['unit']}, 单价{r['unit_price']}元/{r['unit']}")
# 输出:
# 蓝月亮 3kg: 总价89.9元, 数量3000g, 单价0.03元/g
# 蓝月亮 1kg: 总价49.9元, 数量1000g, 单价0.0499元/g
# 蓝月亮 500g: 总价29.9元, 数量500g, 单价0.0598元/g/**
* 多包装单价对比
* @param {Array<{name:string, totalPrice:number, quantity:number, unit:string}>} items
* @returns {Array} 按单价升序
*/
function compareUnitPrice(items) {
if (!items || items.length === 0) return [];
return items
.map(item => ({
...item,
unitPrice: parseFloat((item.totalPrice / item.quantity).toFixed(4))
}))
.sort((a, b) => a.unitPrice - b.unitPrice);
}
// 示例:三包薯片
const products = [
{ name: "乐事原味 75g", totalPrice: 7.5, quantity: 75, unit: "g" },
{ name: "乐事原味 104g", totalPrice: 9.9, quantity: 104, unit: "g" },
{ name: "乐事原味 200g", totalPrice: 16.8, quantity: 200, unit: "g" },
];
console.log(compareUnitPrice(products));
// 输出:
// [
// { name: '乐事原味 200g', totalPrice: 16.8, quantity: 200, unit: 'g', unitPrice: 0.084 },
// { name: '乐事原味 104g', totalPrice: 9.9, quantity: 104, unit: 'g', unitPrice: 0.0952 },
// { name: '乐事原味 75g', totalPrice: 7.5, quantity: 75, unit: 'g', unitPrice: 0.1 }
// ]package main
import (
"fmt"
"sort"
)
type Product struct {
Name string
TotalPrice float64
Quantity float64
Unit string
UnitPrice float64
}
func CompareUnitPrice(items []Product) []Product {
if len(items) == 0 {
return items
}
// 计算单价
for i := range items {
items[i].UnitPrice = items[i].TotalPrice / items[i].Quantity
}
// 按单价升序排序
sort.Slice(items, func(i, j int) bool {
return items[i].UnitPrice < items[j].UnitPrice
})
return items
}
func main() {
products := []Product{
{Name: "农夫山泉 550ml", TotalPrice: 1.5, Quantity: 550, Unit: "ml"},
{Name: "农夫山泉 1.5L", TotalPrice: 3.0, Quantity: 1500, Unit: "ml"},
{Name: "农夫山泉 4L", TotalPrice: 6.5, Quantity: 4000, Unit: "ml"},
}
result := CompareUnitPrice(products)
for _, p := range result {
fmt.Printf("%s: 总价%.1f元, 数量%.0f%s, 单价%.4f元/%s\n",
p.Name, p.TotalPrice, p.Quantity, p.Unit, p.UnitPrice, p.Unit)
}
// 输出:
// 农夫山泉 4L: 总价6.5元, 数量4000ml, 单价0.0016元/ml
// 农夫山泉 1.5L: 总价3.0元, 数量1500ml, 单价0.0020元/ml
// 农夫山泉 550ml: 总价1.5元, 数量550ml, 单价0.0027元/ml
}#!/bin/bash
# 使用 awk 计算单价并排序
cat << 'EOF' | awk -F',' '
{
name=$1; total=$2; qty=$3; unit=$4
unit_price = total / qty
printf "%s,%.2f,%.0f%s,%.4f\n", name, total, qty, unit, unit_price
}' | sort -t',' -k5 -n
# 输入格式:名称,总价,数量,单位
# 示例数据(三款抽纸)
# 清风3层130抽,12.9,130,抽
# 清风3层200抽,19.9,200,抽
# 清风3层300抽,26.9,300,抽
# 输出(按单价升序):
# 清风3层300抽,26.90,300抽,0.0897
# 清风3层200抽,19.90,200抽,0.0995
# 清风3层130抽,12.90,130抽,0.0992interface Product {
name: string;
totalPrice: number;
quantity: number;
unit: string;
unitPrice?: number;
}
function compareUnitPrice(items: Product[]): Product[] {
if (items.length === 0) return [];
return items
.map(item => ({
...item,
unitPrice: parseFloat((item.totalPrice / item.quantity).toFixed(4))
}))
.sort((a, b) => a.unitPrice! - b.unitPrice!);
}
// 示例:三款牛奶
const products: Product[] = [
{ name: "蒙牛纯牛奶 250ml", totalPrice: 3.5, quantity: 250, unit: "ml" },
{ name: "蒙牛纯牛奶 1L", totalPrice: 12.8, quantity: 1000, unit: "ml" },
{ name: "蒙牛纯牛奶 2L", totalPrice: 22.5, quantity: 2000, unit: "ml" },
];
console.log(compareUnitPrice(products));
// 输出:
// [
// { name: '蒙牛纯牛奶 2L', totalPrice: 22.5, quantity: 2000, unit: 'ml', unitPrice: 0.0113 },
// { name: '蒙牛纯牛奶 1L', totalPrice: 12.8, quantity: 1000, unit: 'ml', unitPrice: 0.0128 },
// { name: '蒙牛纯牛奶 250ml', totalPrice: 3.5, quantity: 250, unit: 'ml', unitPrice: 0.014 }
// ]可以。本工具专门处理多包装、多规格的单价对比。输入时只需分别填写每个包装的总价、数量及单位(如瓶、克、毫升),系统会自动算出每单位的均价,并横向排序。注意单位必须统一——如果 A 包装按“瓶”算、B 按“毫升”算,结果会不准确,建议先把单位换算成同一维度再输入。
超市标签通常标注的是“每 100 克”或“每 100 毫升”的参考价,而本工具默认按你输入的原始单位(如瓶、袋)计算。如果包装容量不是标准整数(比如一瓶 330ml vs 500ml),单价差异就会明显。建议在输入时将单位统一为“克”或“毫升”,并手动换算好总含量,结果才会与超市口径一致。
检查一下数量和单位的对应关系。常见错误:总价输入的是“元”,但数量填了“箱”而不是拆成“瓶”。比如一箱 24 瓶售价 48 元,正确做法是总价填 48、数量填 24、单位选“瓶”,系统会算出 2 元/瓶;如果数量填 1、单位选“箱”,算出的就是 48 元/箱。本工具完全按你填的数值计算,不自动拆包,所以数量必须是你想对比的最小销售单位。
可以间接算。对于“买三送一”这类场景,把总价填成你实际支付的金额,数量填成你最终到手的总件数(即买三送一就填 4)。比如原价 12 元 3 瓶,买三送一得 4 瓶,总价 12 元、数量 4 瓶,系统算出的单价就是 3 元/瓶。如果赠品规格不同(比如买大送小),建议先按总含量折算后再输入。
纯浏览器端计算,不上传任何数据。所有输入的价格、数量、单位都在本地内存中完成运算,关闭页面即消失。无需担心敏感购物数据泄露,也无需网络连接——输入后结果即时显示,无网络延迟。
本工具在界面中提供了多个输入行,通常支持同时对比 5-8 种包装规格。如果数量不够,可以分批次对比:先比一轮选出性价比最高的几款,再和剩余选项二次对比。因为计算在本地完成,没有服务器限制,实际能添加的行数取决于页面设计,一般日常对比场景完全够用。
结果应该完全一致,因为计算逻辑在本地执行,与设备无关。如果看到差异,大概率是输入错误:手机键盘小容易误触数字,或单位下拉菜单选错了。建议检查两端的输入值是否完全一致(包括小数点位数)。本工具不依赖设备或浏览器版本,纯 JS 计算,结果由输入唯一决定。
可以。只需要在“单位”字段选择或输入“毫升”即可。注意总含量要填准确——比如一瓶 2 升的洗衣液,应换算为 2000 毫升再填入数量。如果包装上同时标了毫升和克,建议统一采用毫升,因为液体密度不同,按重量比价会失真。本工具不区分固液体,单位完全由你自定义。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。