How to Convert Kilometers to Miles and Vice Versa in Batch Script
Unit conversion is a practical requirement for scripts that process geographic data, logistics reports, or hardware specifications from international sources. Converting between Kilometers and Miles requires a simple multiplication by a conversion factor. The challenge in Batch is handling this without decimal support, which requires a "Scaled Integer" approach.
In this guide, we will demonstrate how to perform both conversions with reasonable integer precision.
The Conversion Factors
- Kilometers to Miles:
Miles = Kilometers × 0.621371 - Miles to Kilometers:
Kilometers = Miles × 1.60934
Since Batch cannot use decimals, we multiply by a scaled integer and then divide:
Miles ≈ Kilometers × 621 / 1000Kilometers ≈ Miles × 1609 / 1000
Implementation Script
@echo off
setlocal enabledelayedexpansion
:menu
cls
echo --- DISTANCE CONVERTER ---
echo 1. Kilometers to Miles
echo 2. Miles to Kilometers
echo 3. Exit
echo.
set /p "choice=Select an option: "
if "!choice!"=="1" goto :km2mi
if "!choice!"=="2" goto :mi2km
if "!choice!"=="3" exit /b
goto :menu
:km2mi
set /p "val=Enter Kilometers: "
:: Calculate whole and decimal parts separately
set /a "whole=val * 621371 / 1000000"
set /a "frac=(val * 621371 %% 1000000) / 10000"
if !frac! LSS 10 set "frac=0!frac!"
echo.
echo !val! km is approximately !whole!.!frac! miles.
pause
goto :menu
:mi2km
set /p "val=Enter Miles: "
:: Calculate whole and decimal parts separately
set /a "whole=val * 160934 / 100000"
set /a "frac=(val * 160934 %% 100000) / 1000"
if !frac! LSS 10 set "frac=0!frac!"
echo.
echo !val! miles is approximately !whole!.!frac! km.
pause
goto :menu
Since Batch only supports integer arithmetic, we simulate decimal multiplication by using a larger numerator and dividing by the corresponding power of 10. For example, instead of val × 0.621371, we compute val × 621371 / 1000000. The whole part comes from integer division, and the fractional part comes from the modulo remainder, scaled down to two decimal places.
The intermediate product val * 621371 overflows Batch's 32-bit signed integer limit (2,147,483,647) when val exceeds approximately 3,455. For larger values, reduce the scale factor precision (e.g., use val * 6214 / 10000) or use the PowerShell bridge below.
Why Convert Distance Units in Batch?
- International Reporting: If your organization has offices in both the US (Miles) and Europe (Kilometers), converting distances in logistics or delivery reports ensures consistency.
- Network Cabling: Converting between metric and imperial measurements for planning cable runs in international data centers.
- Geographic Calculations: Scripts that process GPS coordinate deltas often need to express distances in both units.
Important Limitations
All Batch division truncates toward zero, there is no rounding. The result of 5 km × 621371 / 1000000 is 3 (the true value is 3.107). The two-decimal-place output mitigates this, but the last digit may still differ from a properly rounded result.
There is a tradeoff between decimal precision and the maximum input value:
| Scale Factor | Formula | Max Input | Precision |
|---|---|---|---|
× 621 / 1000 | Low precision | ~3,457,300 | Whole number |
× 6214 / 10000 | Medium | ~345,500 | ~1 decimal |
× 621371 / 1000000 | High precision | ~3,455 | ~2 decimals |
Choose the scale factor that best fits your expected input range.
PowerShell for Precision
@echo off
setlocal
set /p "km=Enter Kilometers: "
for /f "usebackq delims=" %%R in (`
powershell -NoProfile -Command "[math]::Round(%km% * 0.621371, 2)"
`) do set "miles=%%R"
echo %km% km = %miles% miles
pause
PowerShell supports floating-point arithmetic natively and the [math]::Round() method provides precise control over decimal places. Use it when your inputs may be large or when exact decimal output is required.
Conclusion
Converting between kilometers and miles is a simple but practical tool for any script handling international data. While Batch's integer-only math introduces small rounding errors, the scaled-integer approach provides a reliable approximation. For applications requiring high precision, the PowerShell bridge fills the gap seamlessly.