# Stripe amounts are integers, and not all currencies have cents
## The integer rule
`amount` is always an integer in the smallest currency unit. 2000 with currency `usd` is $20.00. There are no decimals, ever. If your code computes `19.99 * 100` in floating point, round explicitly; float math gives 1998.9999 and Stripe rejects or mischarges.
## Zero-decimal currencies
For zero-decimal currencies the amount IS the charge, no multiplication. From Stripe's docs: to charge 10 JPY you pass amount 10, not 1000.
Zero-decimal examples: JPY, KRW, VND, and others on the supported-currencies list. Three-decimal currencies exist too (e.g. BHD, JOD), where 1000 means 1.000 units.
Rules:
1. Look the currency up on the supported currencies list before writing amount math.
2. If zero-decimal, pass the face amount as the integer.
3. If standard (USD, EUR, GBP), multiply the major-unit amount by 100 and round to an integer first.
4. Never branch on "looks like" logic. Branch on the documented list.
## Minimums
Stripe enforces a minimum charge amount per currency (about $0.50 USD equivalent). Test-mode $0.10 charges that pass locally will fail as "amount too small" in real currencies. Check the minimum for the currency you charge in.
## Checklist
- Currency codes are lowercase three-letter codes (`jpy`, not `JPY`).
- Amount math happens in integers from the first line of code.
- Zero-decimal lookup is a list check, not a guess.