# inventory.stock-turnover Three measures of how quickly stock moves over a period, all at cost: - **turns** (stock turnover ratio) = cost of sales / average stock, where average stock is (opening + closing) / 2. Six turns a year means the average holding is sold six times over. - **daysInventoryOutstanding** = average stock / cost of sales x periodDays: how many days the average holding represents; periodDays / turns. - **daysOfCover** = closing stock / cost of sales x periodDays: how many days the stock on hand now would last at this period's rate of use. This is the figure a warehouse plans with; it looks forward from the closing stock. **Exact, then rounded once.** Each ratio is a single division of whole minor units, rounded half-up with `math.round-div` to hundredths (turns) or tenths (days), and only then turned into a float. So 0.005 turns is 0.01 in every language, where `Math.round(x * 100) / 100` and Python's `round(x, 2)` disagree. `averageStock` is rounded half-up to a minor unit for display; the ratios use the exact sum, not the rounded average. **No answer is null, not zero or infinity.** Turns is null when average stock is zero; the two day counts are null when cost of sales is zero (stock that does not move has no cover horizon). Use cost values throughout: turnover on sales value against stock at cost overstates it by the margin. Stock values and cost of sales may not be negative, the three amounts must share a currency, and periodDays must be at least 1. Source: the standard definitions, e.g. CIMA Official Terminology (inventory turnover, inventory days).