{"id":285,"date":"2026-06-20T12:16:47","date_gmt":"2026-06-20T04:16:47","guid":{"rendered":"http:\/\/43.134.36.201\/?p=285"},"modified":"2026-06-22T17:04:47","modified_gmt":"2026-06-22T09:04:47","slug":"285","status":"publish","type":"post","link":"https:\/\/www.cpb-vip.com\/?p=285","title":{"rendered":"\u70e7\u78b1\u6362\u7b97\u5de5\u5177"},"content":{"rendered":"\n<script data-wp-block-html=\"js\">\ndocument.addEventListener('DOMContentLoaded', function() {\n    \/\/ --- \u6570\u636e\u8868 (20\u00b0C NaOH) ---\n    const data = [\n        { density: 1.007, be: 1.0, wt: 0.59, gl: 6.0 },\n        { density: 1.014, be: 2.0, wt: 1.2, gl: 12.0 },\n        { density: 1.022, be: 3.0, wt: 1.85, gl: 18.9 },\n        { density: 1.029, be: 4.0, wt: 2.5, gl: 25.7 },\n        { density: 1.036, be: 5.0, wt: 3.15, gl: 32.6 },\n        { density: 1.045, be: 6.0, wt: 3.79, gl: 39.6 },\n        { density: 1.052, be: 7.0, wt: 4.5, gl: 47.3 },\n        { density: 1.06, be: 8.0, wt: 5.2, gl: 55.0 },\n        { density: 1.067, be: 9.0, wt: 5.86, gl: 62.5 },\n        { density: 1.075, be: 10.0, wt: 6.58, gl: 70.7 },\n        { density: 1.083, be: 11.0, wt: 7.3, gl: 79.1 },\n        { density: 1.091, be: 12.0, wt: 8.07, gl: 88.0 },\n        { density: 1.1, be: 13.0, wt: 8.78, gl: 96.6 },\n        { density: 1.108, be: 14.0, wt: 9.5, gl: 105.3 },\n        { density: 1.116, be: 15.0, wt: 10.3, gl: 114.9 },\n        { density: 1.125, be: 16.0, wt: 11.06, gl: 124.4 },\n        { density: 1.134, be: 17.0, wt: 12.69, gl: 134.0 },\n        { density: 1.142, be: 18.0, wt: 12.69, gl: 145.0 },\n        { density: 1.152, be: 19.0, wt: 13.5, gl: 155.5 },\n        { density: 1.162, be: 20.0, wt: 14.35, gl: 166.7 },\n        { density: 1.171, be: 21.0, wt: 15.15, gl: 177.4 },\n        { density: 1.18, be: 22.0, wt: 16.0, gl: 188.8 },\n        { density: 1.19, be: 23.0, wt: 16.91, gl: 201.2 },\n        { density: 1.2, be: 24.0, wt: 17.81, gl: 213.7 },\n        { density: 1.21, be: 25.0, wt: 18.71, gl: 226.4 },\n        { density: 1.22, be: 26.0, wt: 19.65, gl: 239.7 },\n        { density: 1.231, be: 27.0, wt: 20.6, gl: 253.6 },\n        { density: 1.241, be: 28.0, wt: 21.55, gl: 267.4 },\n        { density: 1.251, be: 29.0, wt: 22.5, gl: 281.7 },\n        { density: 1.263, be: 30.0, wt: 23.5, gl: 296.8 },\n        { density: 1.274, be: 31.0, wt: 24.43, gl: 311.9 },\n        { density: 1.285, be: 32.0, wt: 25.5, gl: 327.7 },\n        { density: 1.297, be: 33.0, wt: 26.55, gl: 341.7 },\n        { density: 1.308, be: 34.0, wt: 27.65, gl: 361.7 },\n        { density: 1.32, be: 35.0, wt: 28.83, gl: 380.6 },\n        { density: 1.332, be: 36.0, wt: 30.0, gl: 399.6 },\n        { density: 1.345, be: 37.0, wt: 31.2, gl: 419.6 },\n        { density: 1.357, be: 38.0, wt: 32.5, gl: 441.0 },\n        { density: 1.37, be: 39.0, wt: 33.73, gl: 461.1 },\n        { density: 1.383, be: 40.0, wt: 35.0, gl: 484.1 },\n        { density: 1.397, be: 41.0, wt: 36.36, gl: 507.9 },\n        { density: 1.41, be: 42.0, wt: 37.65, gl: 530.9 },\n        { density: 1.424, be: 43.0, wt: 39.06, gl: 556.2 },\n        { density: 1.438, be: 44.0, wt: 40.47, gl: 582.0 },\n        { density: 1.453, be: 45.0, wt: 42.02, gl: 610.6 },\n        { density: 1.468, be: 46.0, wt: 43.58, gl: 639.8 },\n        { density: 1.483, be: 47.0, wt: 45.16, gl: 669.7 },\n        { density: 1.498, be: 48.0, wt: 46.73, gl: 700.0 },\n        { density: 1.514, be: 49.0, wt: 48.41, gl: 732.9 },\n        { density: 1.53, be: 50.0, wt: 50.1, gl: 766.5 }\n    ];\n\n    function interp(val, keyIn, keyOut) {\n        let a = data[0], b = data[data.length - 1];\n        if (val <= a[keyIn]) return a[keyOut];\n        if (val >= b[keyIn]) return b[keyOut];\n        for (let i = 0; i < data.length - 1; i++) {\n            let r1 = data[i], r2 = data[i + 1];\n            if (val >= r1[keyIn] && val <= r2[keyIn]) {\n                return r1[keyOut] + (val - r1[keyIn]) * (r2[keyOut] - r1[keyOut]) \/ (r2[keyIn] - r1[keyIn]);\n            }\n        }\n        return b[keyOut];\n    }\n\n    function toStd(type, val) {\n        if (type === 'wt') return { wt: val, be: interp(val, 'wt', 'be'), density: interp(val, 'wt', 'density'), gl: interp(val, 'wt', 'gl') };\n        if (type === 'be') return { be: val, wt: interp(val, 'be', 'wt'), density: interp(val, 'be', 'density'), gl: interp(val, 'be', 'gl') };\n        if (type === 'density') return { density: val, wt: interp(val, 'density', 'wt'), be: interp(val, 'density', 'be'), gl: interp(val, 'density', 'gl') };\n        return { gl: val, wt: interp(val, 'gl', 'wt'), be: interp(val, 'gl', 'be'), density: interp(val, 'gl', 'density') };\n    }\n\n    function calc() {\n        const stVal = parseFloat(document.getElementById('sv').value);\n        const ttVal = parseFloat(document.getElementById('tv').value);\n        const V = parseFloat(document.getElementById('vol').value);\n        if (isNaN(stVal) || isNaN(ttVal) || isNaN(V) || V <= 0) return;\n\n        const stType = document.getElementById('st').value;\n        const ttType = document.getElementById('tt').value;\n        const s = toStd(stType, stVal);\n        const t = toStd(ttType, ttVal);\n\n        document.getElementById('swt').textContent = s.wt.toFixed(2);\n        document.getElementById('sbe').textContent = s.be.toFixed(2);\n        document.getElementById('sd').textContent = s.density.toFixed(3);\n        document.getElementById('sgl').textContent = s.gl.toFixed(1);\n        document.getElementById('twt').textContent = t.wt.toFixed(2);\n        document.getElementById('tbe').textContent = t.be.toFixed(2);\n        document.getElementById('td').textContent = t.density.toFixed(3);\n        document.getElementById('tgl').textContent = t.gl.toFixed(1);\n\n        const pure = t.gl * V \/ 1000;\n        const liqMass = pure \/ (s.wt \/ 100);\n        const liqVol = liqMass \/ s.density;\n        const totalMass = V * t.density;\n        let waterMass = totalMass - liqMass;\n\n        document.getElementById('pure').textContent = pure.toFixed(2);\n        document.getElementById('liq').textContent = liqMass.toFixed(2);\n        document.getElementById('liqVolSub').textContent = '\u2248 ' + liqVol.toFixed(2) + ' L';\n\n        const waterEl = document.getElementById('water');\n        const waterVolSubEl = document.getElementById('waterVolSub');\n        if (waterMass < -0.01) {\n            waterEl.textContent = '\u26a0\ufe0f \u9700\u52a0\u6d53\u6db2\u78b1';\n            waterEl.style.color = '#fbbf24';\n            waterVolSubEl.textContent = '\u73b0\u6709\u6db2\u78b1\u6d53\u5ea6\u4f4e\u4e8e\u76ee\u6807';\n            waterVolSubEl.style.color = '#fbbf24';\n        } else if (Math.abs(waterMass) < 0.01) {\n            waterEl.textContent = '0.00';\n            waterEl.style.color = '#94a3b8';\n            waterVolSubEl.textContent = '\u2248 0.00 L (\u65e0\u9700\u8865\u6c34)';\n            waterVolSubEl.style.color = '#94a3b8';\n        } else {\n            waterEl.textContent = waterMass.toFixed(2);\n            waterEl.style.color = '#fff';\n            waterVolSubEl.textContent = '\u2248 ' + waterMass.toFixed(2) + ' L';\n            waterVolSubEl.style.color = 'rgba(255,255,255,0.8)';\n        }\n    }\n\n    \/\/ \u7ed1\u5b9a\u4e8b\u4ef6\n    document.querySelectorAll('#st, #sv, #tt, #tv, #vol').forEach(el => {\n        el.addEventListener('input', calc);\n        el.addEventListener('change', calc);\n    });\n    calc();\n});\n<\/script>\n\n<!DOCTYPE html>\n<html lang=\"zh\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>NaOH \u6db2\u78b1\u5de5\u827a\u8ba1\u7b97 V4 Industrial<\/title>\n    <style>\n        * {\n            box-sizing: border-box;\n            margin: 0;\n            padding: 0;\n        }\n        body {\n            font-family: 'Segoe UI', 'Microsoft YaHei', system-ui, sans-serif;\n            background: #f0f4f9;\n            padding: 24px;\n            color: #1e293b;\n        }\n        .wrap {\n            max-width: 1400px;\n            margin: 0 auto;\n        }\n        .card {\n            background: #ffffff;\n            border-radius: 16px;\n            padding: 20px 24px;\n            margin-bottom: 18px;\n            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);\n            border: 1px solid #e9edf4;\n            transition: box-shadow 0.2s;\n        }\n        .card:hover {\n            box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);\n        }\n        .hero {\n            background: linear-gradient(135deg, #0b3b8c, #1a6bc4);\n            color: #fff;\n            border: none;\n        }\n        .hero h1 {\n            font-size: 26px;\n            font-weight: 600;\n            letter-spacing: 0.5px;\n            display: flex;\n            align-items: center;\n            gap: 12px;\n        }\n        .hero h1 small {\n            font-size: 15px;\n            font-weight: 400;\n            opacity: 0.8;\n        }\n        .grid {\n            display: grid;\n            grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n            gap: 14px 18px;\n            align-items: end;\n        }\n        .grid label {\n            display: block;\n            font-size: 13px;\n            font-weight: 600;\n            color: #475569;\n            margin-bottom: 4px;\n            letter-spacing: 0.3px;\n        }\n        .grid input,\n        .grid select {\n            width: 100%;\n            padding: 10px 12px;\n            border: 1.5px solid #dce1ea;\n            border-radius: 10px;\n            font-size: 15px;\n            background: #fafbfc;\n            transition: border-color 0.2s, box-shadow 0.2s;\n            font-family: inherit;\n        }\n        .grid input:focus,\n        .grid select:focus {\n            outline: none;\n            border-color: #1a6bc4;\n            box-shadow: 0 0 0 3px rgba(26, 107, 196, 0.15);\n            background: #fff;\n        }\n        .grid input::placeholder {\n            color: #aab3c5;\n        }\n        .btn {\n            background: #1a6bc4;\n            color: #fff;\n            border: none;\n            padding: 11px 32px;\n            border-radius: 10px;\n            font-size: 16px;\n            font-weight: 600;\n            cursor: pointer;\n            transition: background 0.2s, transform 0.1s;\n            letter-spacing: 0.3px;\n            display: inline-flex;\n            align-items: center;\n            gap: 8px;\n        }\n        .btn:hover {\n            background: #0f5aad;\n        }\n        .btn:active {\n            transform: scale(0.97);\n        }\n        .result-grid {\n            display: grid;\n            grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n            gap: 12px;\n            margin-top: 4px;\n        }\n        .result-item {\n            background: rgba(255, 255, 255, 0.12);\n            backdrop-filter: blur(2px);\n            border-radius: 12px;\n            padding: 14px 18px;\n            border: 1px solid rgba(255, 255, 255, 0.15);\n        }\n        .result-item .label {\n            font-size: 13px;\n            opacity: 0.8;\n            font-weight: 400;\n            letter-spacing: 0.3px;\n        }\n        .result-item .value {\n            font-size: 34px;\n            font-weight: 700;\n            line-height: 1.2;\n            margin-top: 4px;\n        }\n        .result-item .unit {\n            font-size: 16px;\n            font-weight: 400;\n            opacity: 0.7;\n            margin-left: 4px;\n        }\n        .result-item .sub {\n            font-size: 13px;\n            opacity: 0.7;\n            margin-top: 2px;\n        }\n        .table-wrap {\n            overflow-x: auto;\n            margin-top: 6px;\n        }\n        table {\n            width: 100%;\n            border-collapse: collapse;\n            font-size: 14px;\n        }\n        th,\n        td {\n            padding: 10px 12px;\n            text-align: center;\n            border: 1px solid #e2e8f0;\n        }\n        th {\n            background: #f1f5f9;\n            font-weight: 600;\n            color: #334155;\n            font-size: 13px;\n        }\n        td {\n            background: #fff;\n        }\n        .badge {\n            display: inline-block;\n            background: #eef2ff;\n            color: #4338ca;\n            padding: 2px 12px;\n            border-radius: 20px;\n            font-size: 12px;\n            font-weight: 600;\n        }\n        .note {\n            font-size: 13px;\n            color: #64748b;\n            margin-top: 10px;\n            border-top: 1px dashed #e2e8f0;\n            padding-top: 12px;\n        }\n        .warning {\n            color: #b45309;\n            background: #fffbeb;\n            border: 1px solid #fde68a;\n            border-radius: 8px;\n            padding: 10px 14px;\n            font-weight: 500;\n            display: inline-block;\n        }\n        @media (max-width: 640px) {\n            body {\n                padding: 12px;\n            }\n            .card {\n                padding: 14px 16px;\n            }\n            .result-item .value {\n                font-size: 26px;\n            }\n            .grid {\n                grid-template-columns: 1fr 1fr;\n            }\n            .hero h1 {\n                font-size: 20px;\n                flex-wrap: wrap;\n            }\n        }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"wrap\">\n\n        <div class=\"card hero\">\n            <h1>\n                \u2697\ufe0f \u6db2\u78b1\u5de5\u827a\u8ba1\u7b97\u5668\n                <small>NaOH Dilution \u00b7 Industrial V4<\/small>\n            <\/h1>\n            <div style=\"margin-top:6px; opacity:0.8; font-size:14px;\">\n                \u652f\u6301 \u00b0B\u00e9 \u00b7 wt% \u00b7 \u5bc6\u5ea6(kg\/L) \u00b7 g\/L \u4e92\u7b97 \u00b7 \u81ea\u52a8\u914d\u6db2\n            <\/div>\n        <\/div>\n\n        <!-- \u8f93\u5165\u533a -->\n        <div class=\"card\">\n            <div class=\"grid\">\n                <div>\n                    <label>\ud83d\udccc \u73b0\u6709\u6db2\u78b1\u7c7b\u578b<\/label>\n                    <select id=\"st\">\n                        <option value=\"wt\">wt%<\/option>\n                        <option value=\"be\" selected>\u00b0B\u00e9<\/option>\n                        <option value=\"density\">\u5bc6\u5ea6 (kg\/L)<\/option>\n                        <option value=\"gl\">g\/L<\/option>\n                    <\/select>\n                <\/div>\n                <div>\n                    <label>\ud83d\udcca \u73b0\u6709\u6db2\u78b1\u503c<\/label>\n                    <input id=\"sv\" value=\"50\" step=\"any\" type=\"number\">\n                <\/div>\n                <div>\n                    <label>\ud83c\udfaf \u76ee\u6807\u5de5\u4f5c\u6db2\u7c7b\u578b<\/label>\n                    <select id=\"tt\">\n                        <option value=\"gl\">g\/L<\/option>\n                        <option value=\"wt\">wt%<\/option>\n                        <option value=\"be\">\u00b0B\u00e9<\/option>\n                        <option value=\"density\">\u5bc6\u5ea6 (kg\/L)<\/option>\n                    <\/select>\n                <\/div>\n                <div>\n                    <label>\ud83c\udfaf \u76ee\u6807\u5de5\u4f5c\u6db2\u503c<\/label>\n                    <input id=\"tv\" value=\"80\" step=\"any\" type=\"number\">\n                <\/div>\n                <div>\n                    <label>\ud83e\uddea \u76ee\u6807\u4f53\u79ef (L)<\/label>\n                    <input id=\"vol\" value=\"1000\" step=\"any\" type=\"number\">\n                <\/div>\n            <\/div>\n            <div style=\"margin-top:16px; display:flex; gap:12px; flex-wrap:wrap; align-items:center;\">\n                <button class=\"btn\" onclick=\"calc()\">\u27f3 \u8ba1\u7b97<\/button>\n                <span style=\"font-size:13px; color:#64748b;\">\n                    \u26a1 \u8f93\u5165\u540e\u81ea\u52a8\u8ba1\u7b97 \u00b7 \u652f\u6301\u5c0f\u6570\n                <\/span>\n            <\/div>\n        <\/div>\n\n        <!-- \u7ed3\u679c\u5361\u7247 -->\n        <div class=\"card\" style=\"background:linear-gradient(135deg,#0b3b8c,#1a6bc4); color:#fff; border:none;\">\n            <div class=\"result-grid\">\n                <div class=\"result-item\">\n                    <div class=\"label\">\ud83e\uddea \u7eaf NaOH \u9700\u6c42<\/div>\n                    <div class=\"value\"><span id=\"pure\">\u2014<\/span><span class=\"unit\">kg<\/span><\/div>\n                    <div class=\"sub\">100% \u56fa\u78b1\u5f53\u91cf<\/div>\n                <\/div>\n                <div class=\"result-item\">\n                    <div class=\"label\">\ud83e\uded7 \u6db2\u78b1\u9700\u6c42<\/div>\n                    <div class=\"value\"><span id=\"liq\">\u2014<\/span><span class=\"unit\">kg<\/span><\/div>\n                    <div class=\"sub\" id=\"liqVolSub\">\u2248 \u2014 L<\/div>\n                <\/div>\n                <div class=\"result-item\">\n                    <div class=\"label\">\ud83d\udca7 \u8865\u6c34\u91cf <span style=\"font-weight:400;opacity:0.7;\">(\u8fd1\u4f3c)<\/span><\/div>\n                    <div class=\"value\"><span id=\"water\">\u2014<\/span><span class=\"unit\">kg<\/span><\/div>\n                    <div class=\"sub\" id=\"waterVolSub\">\u2248 \u2014 L<\/div>\n                <\/div>\n            <\/div>\n            <div style=\"margin-top:12px; font-size:13px; opacity:0.8; border-top:1px solid rgba(255,255,255,0.15); padding-top:12px;\">\n                \u2699\ufe0f \u8865\u6c34\u6309\u6c34\u5bc6\u5ea6 \u2248 1 kg\/L \u6362\u7b97 \u00b7 \u6df7\u5408\u4f53\u79ef\u53d8\u5316\u5df2\u8fd1\u4f3c\u5904\u7406\n            <\/div>\n        <\/div>\n\n        <!-- \u6362\u7b97\u8868 -->\n        <div class=\"card\">\n            <h3 style=\"font-size:16px; font-weight:600; margin-bottom:12px; color:#1e293b;\">\n                \ud83d\udccb \u6362\u7b97\u7ed3\u679c\u5bf9\u7167\n            <\/h3>\n            <div class=\"table-wrap\">\n                <table>\n                    <thead>\n                        <tr>\n                            <th><\/th>\n                            <th>wt%<\/th>\n                            <th>\u00b0B\u00e9<\/th>\n                            <th>\u5bc6\u5ea6 (kg\/L)<\/th>\n                            <th>g\/L<\/th>\n                        <\/tr>\n                    <\/thead>\n                    <tbody>\n                        <tr>\n                            <td style=\"font-weight:600; background:#f8fafc;\">\u73b0\u6709\u6db2\u78b1<\/td>\n                            <td id=\"swt\">\u2014<\/td>\n                            <td id=\"sbe\">\u2014<\/td>\n                            <td id=\"sd\">\u2014<\/td>\n                            <td id=\"sgl\">\u2014<\/td>\n                        <\/tr>\n                        <tr>\n                            <td style=\"font-weight:600; background:#f8fafc;\">\u76ee\u6807\u5de5\u4f5c\u6db2<\/td>\n                            <td id=\"twt\">\u2014<\/td>\n                            <td id=\"tbe\">\u2014<\/td>\n                            <td id=\"td\">\u2014<\/td>\n                            <td id=\"tgl\">\u2014<\/td>\n                        <\/tr>\n                    <\/tbody>\n                <\/table>\n            <\/div>\n            <div class=\"note\">\n                <span class=\"badge\">\u24d8<\/span> \u6570\u636e\u57fa\u4e8e NaOH \u6c34\u6eb6\u6db2\u6807\u51c6\u5bc6\u5ea6\u8868 (20\u00b0C) \u63d2\u503c\u8ba1\u7b97\n            <\/div>\n        <\/div>\n\n        <!-- \u5feb\u901f\u53c2\u8003 -->\n        <div class=\"card\" style=\"background:#f8fafc; border-color:#dce1ea;\">\n            <div style=\"display:flex; flex-wrap:wrap; gap:18px 40px; font-size:14px;\">\n                <div><strong>50\u00b0B\u00e9 \u6db2\u78b1<\/strong> &nbsp; 1 L \u2248 1.53 kg &nbsp;\u00b7&nbsp; 100 L \u2248 153.3 kg &nbsp;\u00b7&nbsp; 1 t \u2248 652.3 L<\/div>\n                <div><strong>32% \u6db2\u78b1<\/strong> &nbsp; 1 L \u2248 1.285 kg &nbsp;\u00b7&nbsp; 100 L \u2248 128.5 kg<\/div>\n            <\/div>\n        <\/div>\n\n    <\/div>\n\n    <script>\n        \/\/ =============== \u6570\u636e\u8868 (20\u00b0C NaOH \u6c34\u6eb6\u6db2) ===============\n        const data = [\n            { density: 1.007, be: 1.0, wt: 0.59, gl: 6.0 },\n            { density: 1.014, be: 2.0, wt: 1.2, gl: 12.0 },\n            { density: 1.022, be: 3.0, wt: 1.85, gl: 18.9 },\n            { density: 1.029, be: 4.0, wt: 2.5, gl: 25.7 },\n            { density: 1.036, be: 5.0, wt: 3.15, gl: 32.6 },\n            { density: 1.045, be: 6.0, wt: 3.79, gl: 39.6 },\n            { density: 1.052, be: 7.0, wt: 4.5, gl: 47.3 },\n            { density: 1.06, be: 8.0, wt: 5.2, gl: 55.0 },\n            { density: 1.067, be: 9.0, wt: 5.86, gl: 62.5 },\n            { density: 1.075, be: 10.0, wt: 6.58, gl: 70.7 },\n            { density: 1.083, be: 11.0, wt: 7.3, gl: 79.1 },\n            { density: 1.091, be: 12.0, wt: 8.07, gl: 88.0 },\n            { density: 1.1, be: 13.0, wt: 8.78, gl: 96.6 },\n            { density: 1.108, be: 14.0, wt: 9.5, gl: 105.3 },\n            { density: 1.116, be: 15.0, wt: 10.3, gl: 114.9 },\n            { density: 1.125, be: 16.0, wt: 11.06, gl: 124.4 },\n            { density: 1.134, be: 17.0, wt: 11.84, gl: 134.0 },\n            { density: 1.142, be: 18.0, wt: 12.69, gl: 145.0 },\n            { density: 1.152, be: 19.0, wt: 13.5, gl: 155.5 },\n            { density: 1.162, be: 20.0, wt: 14.35, gl: 166.7 },\n            { density: 1.171, be: 21.0, wt: 15.15, gl: 177.4 },\n            { density: 1.18, be: 22.0, wt: 16.0, gl: 188.8 },\n            { density: 1.19, be: 23.0, wt: 16.91, gl: 201.2 },\n            { density: 1.2, be: 24.0, wt: 17.81, gl: 213.7 },\n            { density: 1.21, be: 25.0, wt: 18.71, gl: 226.4 },\n            { density: 1.22, be: 26.0, wt: 19.65, gl: 239.7 },\n            { density: 1.231, be: 27.0, wt: 20.6, gl: 253.6 },\n            { density: 1.241, be: 28.0, wt: 21.55, gl: 267.4 },\n            { density: 1.251, be: 29.0, wt: 22.5, gl: 281.7 },\n            { density: 1.263, be: 30.0, wt: 23.5, gl: 296.8 },\n            { density: 1.274, be: 31.0, wt: 24.43, gl: 311.9 },\n            { density: 1.285, be: 32.0, wt: 25.5, gl: 327.7 },\n            { density: 1.297, be: 33.0, wt: 26.55, gl: 341.7 },\n            { density: 1.308, be: 34.0, wt: 27.65, gl: 361.7 },\n            { density: 1.32, be: 35.0, wt: 28.83, gl: 380.6 },\n            { density: 1.332, be: 36.0, wt: 30.0, gl: 399.6 },\n            { density: 1.345, be: 37.0, wt: 31.2, gl: 419.6 },\n            { density: 1.357, be: 38.0, wt: 32.5, gl: 441.0 },\n            { density: 1.37, be: 39.0, wt: 33.73, gl: 461.1 },\n            { density: 1.383, be: 40.0, wt: 35.0, gl: 484.1 },\n            { density: 1.397, be: 41.0, wt: 36.36, gl: 507.9 },\n            { density: 1.41, be: 42.0, wt: 37.65, gl: 530.9 },\n            { density: 1.424, be: 43.0, wt: 39.06, gl: 556.2 },\n            { density: 1.438, be: 44.0, wt: 40.47, gl: 582.0 },\n            { density: 1.453, be: 45.0, wt: 42.02, gl: 610.6 },\n            { density: 1.468, be: 46.0, wt: 43.58, gl: 639.8 },\n            { density: 1.483, be: 47.0, wt: 45.16, gl: 669.7 },\n            { density: 1.498, be: 48.0, wt: 46.73, gl: 700.0 },\n            { density: 1.514, be: 49.0, wt: 48.41, gl: 732.9 },\n            { density: 1.53, be: 50.0, wt: 50.1, gl: 766.5 }\n        ];\n\n        \/\/ =============== \u63d2\u503c\u5de5\u5177 ===============\n        function interp(val, keyIn, keyOut) {\n            const a = data[0],\n                b = data[data.length - 1];\n            if (val <= a[keyIn]) return a[keyOut];\n            if (val >= b[keyIn]) return b[keyOut];\n            for (let i = 0; i < data.length - 1; i++) {\n                const r1 = data[i],\n                    r2 = data[i + 1];\n                if (val >= r1[keyIn] && val <= r2[keyIn]) {\n                    return r1[keyOut] + (val - r1[keyIn]) * (r2[keyOut] - r1[keyOut]) \/ (r2[keyIn] - r1[keyIn]);\n                }\n            }\n            return b[keyOut];\n        }\n\n        \/\/ =============== \u7c7b\u578b\u8f6c\u6362 ===============\n        function toStd(type, val) {\n            if (type === 'wt') {\n                return { wt: val, be: interp(val, 'wt', 'be'), density: interp(val, 'wt', 'density'), gl: interp(val, 'wt',\n                        'gl') };\n            }\n            if (type === 'be') {\n                return { be: val, wt: interp(val, 'be', 'wt'), density: interp(val, 'be', 'density'), gl: interp(val, 'be',\n                        'gl') };\n            }\n            if (type === 'density') {\n                return { density: val, wt: interp(val, 'density', 'wt'), be: interp(val, 'density', 'be'), gl: interp(val,\n                        'density', 'gl') };\n            }\n            \/\/ 'gl'\n            return { gl: val, wt: interp(val, 'gl', 'wt'), be: interp(val, 'gl', 'be'), density: interp(val, 'gl',\n                    'density') };\n        }\n\n        \/\/ =============== \u4e3b\u8ba1\u7b97 ===============\n        function calc() {\n            \/\/ 1. \u8bfb\u53d6\u8f93\u5165\n            const stVal = parseFloat(document.getElementById('sv').value);\n            const ttVal = parseFloat(document.getElementById('tv').value);\n            const V = parseFloat(document.getElementById('vol').value);\n\n            if (isNaN(stVal) || isNaN(ttVal) || isNaN(V) || V <= 0) {\n                alert('\u26a0\ufe0f \u8bf7\u8f93\u5165\u6709\u6548\u7684\u6570\u503c (\u4f53\u79ef > 0)');\n                return;\n            }\n\n            const stType = document.getElementById('st').value;\n            const ttType = document.getElementById('tt').value;\n\n            \/\/ 2. \u8f6c\u6362\n            const s = toStd(stType, stVal);\n            const t = toStd(ttType, ttVal);\n\n            \/\/ 3. \u66f4\u65b0\u6362\u7b97\u8868\n            document.getElementById('swt').textContent = s.wt.toFixed(2);\n            document.getElementById('sbe').textContent = s.be.toFixed(2);\n            document.getElementById('sd').textContent = s.density.toFixed(3);\n            document.getElementById('sgl').textContent = s.gl.toFixed(1);\n\n            document.getElementById('twt').textContent = t.wt.toFixed(2);\n            document.getElementById('tbe').textContent = t.be.toFixed(2);\n            document.getElementById('td').textContent = t.density.toFixed(3);\n            document.getElementById('tgl').textContent = t.gl.toFixed(1);\n\n            \/\/ 4. \u914d\u6db2\u8ba1\u7b97\n            \/\/ \u7eaf NaOH \u9700\u6c42 (kg)\n            const pure = t.gl * V \/ 1000;\n\n            \/\/ \u6db2\u78b1\u8d28\u91cf (kg)\n            const liqMass = pure \/ (s.wt \/ 100);\n\n            \/\/ \u6db2\u78b1\u4f53\u79ef (L)\n            const liqVol = liqMass \/ s.density;\n\n            \/\/ ----- \u8865\u6c34\u91cf (\u8d28\u91cf\u6cd5, \u66f4\u51c6\u786e) -----\n            \/\/ \u76ee\u6807\u5de5\u4f5c\u6db2\u603b\u8d28\u91cf = V \u00d7 \u76ee\u6807\u5bc6\u5ea6\n            const totalMass = V * t.density;\n            \/\/ \u8865\u6c34\u91cf (kg) = \u603b\u8d28\u91cf - \u6db2\u78b1\u8d28\u91cf\n            let waterMass = totalMass - liqMass;\n\n            \/\/ \u8865\u6c34\u91cf\u5bf9\u5e94\u7684\u4f53\u79ef (L) \u2248 \u8d28\u91cf (kg) \/ 1\n            const waterVol = waterMass; \/\/ \u56e0\u4e3a\u6c34\u5bc6\u5ea6 \u2248 1 kg\/L\n\n            \/\/ 5. \u663e\u793a\u7ed3\u679c\n            document.getElementById('pure').textContent = pure.toFixed(2);\n\n            \/\/ \u6db2\u78b1\u9700\u6c42\n            document.getElementById('liq').textContent = liqMass.toFixed(2);\n            document.getElementById('liqVolSub').textContent = '\u2248 ' + liqVol.toFixed(2) + ' L';\n\n            \/\/ \u8865\u6c34\u91cf \u2014\u2014 \u5904\u7406\u5f02\u5e38\u60c5\u51b5\n            const waterEl = document.getElementById('water');\n            const waterVolSubEl = document.getElementById('waterVolSub');\n\n            if (waterMass < -0.01) {\n                \/\/ \u8865\u6c34\u91cf\u4e3a\u8d1f \u2192 \u9700\u8981\u52a0\u6d53\u6db2\u78b1\n                waterEl.textContent = '\u26a0\ufe0f \u9700\u52a0\u6d53\u6db2\u78b1';\n                waterEl.style.color = '#fbbf24';\n                waterVolSubEl.textContent = '\u73b0\u6709\u6db2\u78b1\u6d53\u5ea6\u4f4e\u4e8e\u76ee\u6807';\n                waterVolSubEl.style.color = '#fbbf24';\n            } else if (Math.abs(waterMass) < 0.01) {\n                waterEl.textContent = '0.00';\n                waterEl.style.color = '#94a3b8';\n                waterVolSubEl.textContent = '\u2248 0.00 L (\u65e0\u9700\u8865\u6c34)';\n                waterVolSubEl.style.color = '#94a3b8';\n            } else {\n                waterEl.textContent = waterMass.toFixed(2);\n                waterEl.style.color = '#fff';\n                waterVolSubEl.textContent = '\u2248 ' + waterVol.toFixed(2) + ' L';\n                waterVolSubEl.style.color = 'rgba(255,255,255,0.8)';\n            }\n\n            \/\/ \u989d\u5916\uff1a\u5982\u679c wt% \u63a5\u8fd1\uff0c\u63d0\u793a\n            const diffWt = s.wt - t.wt;\n            if (diffWt < 0 &#038;&#038; waterMass > -0.01) {\n                \/\/ \u73b0\u6709\u6d53\u5ea6\u4f4e\u4e8e\u76ee\u6807\uff0c\u4f46\u8865\u6c34\u91cf\u5374\u4e3a\u6b63 \u2192 \u6570\u636e\u5f02\u5e38\uff0c\u4f46\u7406\u8bba\u4e0a\u4e0d\u4f1a\u53d1\u751f\n                \/\/ \u56e0\u4e3a\u5982\u679c s.wt < t.wt\uff0c\u5219 liqMass > totalMass\uff0c\u8865\u6c34\u91cf\u5e94\u4e3a\u8d1f\n                \/\/ \u8fd9\u91cc\u4e0d\u505a\u989d\u5916\u5904\u7406\uff0c\u56e0\u4e3a\u5df2\u7ecf\u901a\u8fc7 waterMass < -0.01 \u6355\u6349\u4e86\n            }\n        }\n\n        \/\/ =============== \u81ea\u52a8\u8ba1\u7b97 (\u8f93\u5165\u5373\u7b97) ===============\n        document.querySelectorAll('#st, #sv, #tt, #tv, #vol').forEach(el => {\n            el.addEventListener('input', calc);\n            el.addEventListener('change', calc);\n        });\n\n        \/\/ \u521d\u59cb\u8ba1\u7b97\n        window.onload = calc;\n    <\/script>\n\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>NaOH \u6db2\u78b1\u5de5\u827a\u8ba1\u7b97 V4 Industrial..<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-285","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.cpb-vip.com\/index.php?rest_route=\/wp\/v2\/posts\/285","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.cpb-vip.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.cpb-vip.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.cpb-vip.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.cpb-vip.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=285"}],"version-history":[{"count":4,"href":"https:\/\/www.cpb-vip.com\/index.php?rest_route=\/wp\/v2\/posts\/285\/revisions"}],"predecessor-version":[{"id":346,"href":"https:\/\/www.cpb-vip.com\/index.php?rest_route=\/wp\/v2\/posts\/285\/revisions\/346"}],"wp:attachment":[{"href":"https:\/\/www.cpb-vip.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=285"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.cpb-vip.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=285"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.cpb-vip.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=285"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}