Megabytes to gigabytes
HTML for this example
Select the code and use your copy shortcut. Changes in this preview are temporary.
<!doctype html><html lang="en-US"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Megabytes to gigabytes</title><style>*{box-sizing:border-box} :root{color-scheme:light;--ink:#20303b;--muted:#536570;--line:#d3dce1;--accent:#245c76;--paper:#fff;--soft:#edf3f6}body{margin:0;background:#f3f5f5;color:var(--ink);font:16px/1.5 system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}main{max-width:1080px;margin:auto;padding:30px 32px 64px}header{margin-bottom:20px}h1{font-size:clamp(1.5rem,3vw,2.15rem);line-height:1.18;letter-spacing:-.035em;margin:0 0 8px}h2{font-size:1.22rem;line-height:1.3;margin:0 0 16px}h3{font-size:1rem;margin:0 0 8px}p{margin:8px 0 16px}small,.muted{color:var(--muted)}.eyebrow{font-size:.76rem;letter-spacing:.13em;text-transform:uppercase;font-weight:750;color:var(--accent);margin-bottom:8px}.panel{background:var(--paper);border:1px solid var(--line);padding:24px;border-radius:16px}.grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:24px}.stack{display:grid;gap:18px}.fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}label{display:block;font-size:.9rem;font-weight:650}input,select,textarea,button{font:inherit}input,select,textarea{display:block;width:100%;min-width:0;margin-top:6px;border:1px solid #8b9ca6;border-radius:7px;padding:10px 12px;background:white;color:var(--ink)}input,select{min-height:46px}textarea{resize:vertical}button{border:1px solid var(--accent);border-radius:7px;padding:10px 16px;min-height:44px;background:var(--accent);color:white;cursor:pointer;font-weight:650}button.secondary{background:white;color:var(--accent)}button:hover{filter:brightness(.94)}:focus-visible{outline:3px solid #d06e1c;outline-offset:3px}.actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:18px}.answer{background:var(--ink);color:white;padding:26px;border-radius:14px}.answer .muted{color:#d9e5eb}.big{font-size:clamp(2.1rem,5vw,3.8rem);font-weight:750;line-height:1.16;letter-spacing:-.045em;margin:8px 0;overflow-wrap:anywhere;font-variant-numeric:tabular-nums}.subresult{font-size:1.2rem;font-weight:650} .formula{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;overflow-wrap:anywhere}.note{border-left:3px solid #b47029;padding:10px 14px;background:#fff5e5;margin:14px 0;color:#66451b}.error{color:#a22621;font-weight:650;min-height:24px;margin:8px 0}.below{margin-top:28px}table{border-collapse:collapse;width:100%;font-size:.94rem}th{text-align:left;color:var(--muted);font-weight:650;font-size:.84rem}th,td{padding:11px 10px;border-bottom:1px solid var(--line);vertical-align:top}th:first-child,td:first-child{padding-left:0}th:last-child,td:last-child{padding-right:0}details{border-top:1px solid var(--line);padding:16px 0}summary{cursor:pointer;font-weight:650}svg{display:block;width:100%;height:auto}.tag{display:inline-block;font-size:.78rem;font-weight:650;padding:3px 8px;border-radius:30px;background:var(--soft);color:var(--accent)}.rule{height:1px;background:var(--line);margin:20px 0}.checklabel{display:flex;gap:10px;align-items:flex-start;font-weight:500}.checklabel input{width:20px;min-height:20px;flex:none;margin:2px 0}pre{white-space:pre-wrap;word-break:break-word;font: .86rem/1.6 ui-monospace,Consolas,monospace;background:#edf1f3;padding:20px;border-radius:8px}a{color:var(--accent)}[hidden]{display:none!important}@media(max-width:720px){main{padding:22px 20px 40px}.grid{grid-template-columns:1fr;gap:18px}.panel{padding:20px}.answer{padding:22px}.big{font-size:2.65rem}}@media(max-width:400px){main{padding:18px 16px 36px}.fields{gap:12px}th,td{padding:9px 6px}.panel{padding:16px}.big{font-size:2.25rem}}@media print{body{background:white}main{max-width:none;padding:0}.actions,button{display:none}.panel{break-inside:avoid}details>*{display:block}}.convert-fields{display:grid;grid-template-columns:2fr 1fr 1fr;gap:16px}@media(max-width:450px){.convert-fields{grid-template-columns:1fr 1fr}.convert-fields>label:first-child{grid-column:1/-1}}</style></head><body><main><header><div class="eyebrow">One quantity · explicit byte units</div><h1>Megabytes to gigabytes</h1></header>
<p>Convert through bytes so decimal and binary units stay distinct.</p>
<section class="answer" aria-live="polite"><div id="source">1500 MB → GB</div><div class="big" id="result">1.5 GB</div><div class="subresult" id="alternate">≈ 1.396983862 GiB</div><p id="bytes" class="formula">1,500,000,000 bytes preserved</p></section>
<section class="panel below"><div class="convert-fields"><label for="amount">Quantity<input id="amount" inputmode="decimal" value="1500" ></label><label for="from">Input unit<select id="from"><option>MB</option><option>GB</option><option>MiB</option><option>GiB</option></select></label><label for="to">Output unit<select id="to"><option>GB</option><option>GiB</option><option>MB</option><option>MiB</option></select></label></div><div class="actions"><button type="button" id="calculate">Convert</button><button type="button" id="sample" class="secondary">Compare 1500 MiB</button><button type="button" id="reset" class="secondary">Reset 1500 MB</button></div><p id="error" role="status" class="error"></p></section>
<section class="below grid"><div class="panel"><h2>Exact byte derivation</h2><p id="derive" class="formula"></p><p id="precision" class="muted"></p><label for="basis">Source label / basis note<input id="basis" value="Illustrative quantity; decimal MB explicitly specified"></label></div><div class="panel"><h2>Compare a declared numeric limit</h2><div class="fields"><label for="limit">Limit amount<input id="limit" inputmode="decimal" value="1600" ></label><label for="limitUnit">Limit unit<select id="limitUnit"><option>MB</option><option>GB</option><option>MiB</option><option>GiB</option></select></label></div><p id="limitResult" class="subresult" aria-live="polite"></p><p class="muted">A numeric comparison only. No file is inspected and no upload permission is established.</p></div></section>
<details class="below"><summary>Unit definitions and input scope</summary><table><tr><th>Decimal</th><th>Binary</th></tr><tr><td>MB = 1,000,000 bytes</td><td>MiB = 1,048,576 bytes</td></tr><tr><td>GB = 1,000,000,000 bytes</td><td>GiB = 1,073,741,824 bytes</td></tr></table><p>1 byte = 8 bits. These units are byte quantities, not bits or transfer rates. Confirm ambiguous source labels before use. Values accept up to six decimal places and a maximum of 1,000,000,000. Fractional bytes are mathematical quantities, not measured file sizes. Outputs round to nine places; exact byte fractions are retained. Entries are not saved.</p></details></main><script>
const $=id=>document.getElementById(id);const put=(id,text)=>{$(id).textContent=text};const fmt=(x,n=6)=>{if(!Number.isFinite(x))throw Error('Result exceeds the numeric range.');let v=(Math.round(Math.abs(x)*10**n)/10**n)*(x<0?-1:1);return Object.is(v,-0)?'0':v.toFixed(n).replace(/\.?0+$/,'')||'0'};const esc=s=>String(s).replace(/[&<>"']/g,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]));
function decimal(s,{max=1000000,signed=false,places=6}={}){s=String(s).trim();if(!s)throw Error('Enter a value; a blank field is not zero.');const r=new RegExp('^'+(signed?'[+-]?':'')+'(?:[0-9]+(?:\\.[0-9]{1,'+places+'})?|\\.[0-9]{1,'+places+'})$');if(!r.test(s))throw Error('Use a '+(signed?'signed':'nonnegative')+' US decimal with up to '+places+' decimal places; no commas or exponents.');const v=Number(s);if(!Number.isFinite(v)||Math.abs(v)>max)throw Error('Enter a value within '+(signed?'-':'0 to ')+max+'.');return v;}
function scaled(s){decimal(s);const [a,b='']=String(s).trim().split('.');return BigInt(a||'0')*1000000n+BigInt(b.padEnd(6,'0'));}
function rational(n,d,places=6){if(d===0n)throw Error('Zero denominator');let neg=(n<0n)!=(d<0n);n=n<0n?-n:n;d=d<0n?-d:d;const scale=10n**BigInt(places),v=n*scale,q=v/d,r=v%d;let rounded=q+(r*2n>=d?1n:0n);let s=(rounded/scale).toString();const f=(rounded%scale).toString().padStart(places,'0').replace(/0+$/,'');if(f)s+='.'+f;return {text:(neg&&rounded!==0n?'-':'')+s,approx:r!==0n};}
function bind(ids,fn){ids.forEach(id=>{ $(id).addEventListener('input',fn);$(id).addEventListener('change',fn); });}
const factors={MB:1000000n,GB:1000000000n,MiB:1048576n,GiB:1073741824n};
function bytesInput(s,unit){decimal(s,{max:1000000000});if(!factors[unit])throw Error('Choose MB, GB, MiB, or GiB.');const [a,b='']=s.trim().split('.');return (BigInt(a||'0')*1000000n+BigInt(b.padEnd(6,'0')))*factors[unit];}
function convert(s,from,to){const n=bytesInput(s,from);if(!factors[to])throw Error('Choose a supported output unit.');return {n,bytes:rational(n,1000000n,6),out:rational(n,1000000n*factors[to],9),gb:rational(n,1000000n*factors.GB,9),gib:rational(n,1000000n*factors.GiB,9)};}
function update(){try{const r=convert($('amount').value,$('from').value,$('to').value);put('source',$('amount').value+' '+$('from').value+' → '+$('to').value);put('result',(r.out.approx?'≈ ':'')+r.out.text+' '+$('to').value);const alt=$('to').value==='GiB'?r.gb:r.gib;put('alternate',(alt.approx?'≈ ':'')+alt.text+' '+($('to').value==='GiB'?'GB':'GiB'));put('bytes',r.bytes.text+' bytes preserved');put('derive',$('amount').value+' × '+factors[$('from').value]+' = '+r.bytes.text+' B; '+r.bytes.text+' / '+factors[$('to').value]+' '+(r.out.approx?'≈':'=')+' '+r.out.text+' '+$('to').value);put('precision',r.out.approx?'Output rounded to nine decimal places. Exact byte quantity retained.':'Output is exact for the entered quantity.');try{const l=bytesInput($('limit').value,$('limitUnit').value);put('limitResult',r.n<l?'Below the declared limit':r.n===l?'Equal to the declared limit':'Above the declared limit');}catch(e){put('limitResult','Limit not compared: '+e.message)}put('error','');}catch(e){put('result','—');['source','alternate','bytes','derive','precision','limitResult'].forEach(id=>put(id,''));put('error',e.message);}}
bind(['amount','from','to','limit','limitUnit'],update);$('calculate').addEventListener('click',update);$('sample').addEventListener('click',()=>{$('amount').value='1500';$('from').value='MiB';$('to').value='GiB';$('basis').value='Illustrative quantity; binary MiB explicitly specified';update()});$('reset').addEventListener('click',()=>{$('amount').value='1500';$('from').value='MB';$('to').value='GB';$('limit').value='1600';$('limitUnit').value='MB';$('basis').value='Illustrative quantity; decimal MB explicitly specified';update()});globalThis.Tool={convert,bytesInput,update};update();
</script></body></html>