# Help:Modulo and round

The MediaWiki extension ParserFunctions enables users to perform simple mathematical computations.

#expr and #ifexpr allow mod and round.

Operator Operation Example
mod "Modulo" (PHP operator %): if a is nonnegative, a mod b is the remainder by division after truncating both operands to an integer, while (-a) mod b = - ( a mod b).

Caveats:
• mod is different from all programming languages, see bugzilla:6068 (marked as won't fix). For compatibility it seems wise to apply it only with integer arguments.
• It has been observed that on Windows a number, before mod is applied, is reduced to php data-type "signed INT", i.e. a signed 32-bits integer , i.e. mod gives wrong results for integers outside the range -2,147,483,648 through 2,147,483,647, see below.
`"{{#expr: 30 mod 7|=}}"` gives "2" 
`"{{#expr: -8 mod -3|=}}"` gives "-2" 
`"{{#expr: -8 mod +3|=}}"` gives "-2" 
`"{{#expr: 8 mod 2.7|=}}"` gives "0"  (should be 2.6)
`"{{#expr: 8 mod 3.2|=}}"` gives "2"  (should be 1.6)
`"{{#expr: 8.9 mod 3|=}}"` gives "2"  (should be 2.9)
round (PHP function round): rounds the number on the left to the nearest multiple of 1/10 raised to the power given on the right; if two are equally near, rounding is away from zero. `"{{#expr: 30/7 round 3|=}}"` gives "4.286" 
`"{{#expr: 30/7 round 0|=}}"` gives "4" 
{{ `#expr: 3456 round -2`}} = 3500

Problem with mod in Windows:

• `"{{#expr:-2147483650 mod 1000000000}}"` gives "-147483650"  (should be -147483650; on Windows 147483646)
• `"{{#expr:-2147483649 mod 1000000000}}"` gives "-147483649"  (should be -147483649; on Windows 147483647)
• `"{{#expr:-2147483648 mod 1000000000}}"` gives "-147483648"  (should be -147483648; on Windows correct)
• `"{{#expr:-2147483647 mod 1000000000}}"` gives "-147483647"  (should be -147483647; on Windows correct)
• `"{{#expr:2147483646 mod 1000000000}}"` gives "147483646"  (should be 147483646; on Windows correct)
• `"{{#expr:2147483647 mod 1000000000}}"` gives "147483647"  (should be 147483647; on Windows correct)
• `"{{#expr:2147483648 mod 1000000000}}"` gives "147483648"  (should be 147483648; on Windows -147483648)
• `"{{#expr:2147483649 mod 1000000000}}"` gives "147483649"  (should be 147483649; on Windows -147483647)

See also , and operator fmod in mw:Extension:ParserFunctions (extended), which both do not have these problems. Also, in file expr.php (the standard one or the extended one) operation "\$left % \$right" can be replaced by "fmod(\$left,\$right)".

Spaces around mod and round are good for readability but not needed for working properly:

• `"{{#expr:7mod3}}"` gives "1" 
• `"{{#expr:7.5round0}}"` gives "8" 

Precedence:

• `"{{#expr:1.234 + 1.234 round 1 + 1}}"` gives "2.47" 

• `"{{#expr:3 * 4 mod 10 * 10}}"` gives "20" 

(mod and multiplication have equal precedence, evaluation from left to right)

To remind the reader of the precedence, one might write:

• `"{{#expr:1.234+1.234 round 1+1}}"` gives "2.47" 
• `"{{#expr:2 + 3*4mod10*10 + 5}}"` gives "27" 
When using spaces where there is precedence, the layout of the expression may be confusing:
`"{{#expr:23+45 mod 10}}"` gives "28" 
`"{{#expr:23 + 45 mod10}}"` gives "28" 
or simply use parentheses:
`"{{#expr:23 + (45 mod 10)}}"` gives "28" 

## Mod

To get a positive mod even for a negative number, use e.g. (700000 + x) mod7 instead of x mod7. The range of the result is now 0-6, provided that x > -700000.

Alternatively, use

• 6 - ( 700006 - x ) mod7

or

• (x - 700006) mod7 + 6.

The range of the result is 0-6, provided that x < 700006.

Working for all x is:

• (x mod7 + 7) mod7

## Round

• `"{{#expr:2.5 round 0}}"` gives "3" 
• `"{{#expr:1.5 round 0}}"` gives "2" 
• `"{{#expr:.5 round 0}}"` gives "1" 
• `"{{#expr:-.5 round 0}}"` gives "-1" 
• `"{{#expr:-1.5 round 0}}"` gives "-2" 
• `"{{#expr:-2.5 round 0}}"` gives "-3" 
• `"{{#expr:2.25 round 1}}"` gives "2.3" 
• `"{{#expr:2.15 round 1}}"` gives "2.2" 
• `"{{#expr:2.05 round 1}}"` gives "2.1" 
• `"{{#expr:-2.05 round 1}}"` gives "-2.1" 
• `"{{#expr:-2.15 round 1}}"` gives "-2.2" 
• `"{{#expr:-2.25 round 1}}"` gives "-2.3" 

To round an integer plus one half for x > -100000 toward plus infinity, use:

• (x + 100000 round 0) - 100000

and to round an integer plus one half for x < 100000 toward minus infinity, use:

• (x - 100000 round 0) + 100000

To round x toward minus infinity, use:

• x + ( x != x round 0 ) * ( ( ( x - .5 ) round 0 ) - x )

and toward plus infinity

• x + ( x != x round 0 ) * ( ( ( x + .5 ) round 0 ) - x )

If x is a long expression this multiplies the length by 5! Under conditions for x there are alternatives:

To round x > -100000 toward minus infinity, use:

• (x - 100000.5 round 0) + 100000

and to round x < 100000 toward plus infinity, use:

• (x + 100000.5 round 0) - 100000

If x is a multiple of 1/n with n<1000 we can round toward minus infinity with:

• x - .499 round 0

For arbitrary n > 1 we can choose instead of -.499 any number between -.5 and -.5 + 1/n.

To find the largest multiple of 7 not larger than x (i.e. to round toward minus infinity to a multiple of 7) we can do:

• ((x-3)/7 round 0) * 7

## Links to other help pages

Help contents | search (all help pages)
Meta | Wikinews | Wikipedia | Wikiquote | Wiktionary | commons: | mw: | b: | s:
Go | Search | Stop words | URL | Namespace | Page name | Section
Logging in and preferences
Logging in | Preferences | User style
Editing
Advanced editing | Editing FAQ | Edit toolbar | Export
Editing shortcuts
Tracking changes
Recent changes (enhanced) | Related changes | Watching pages | Diff
Page history | Edit summary | User contributions | Minor edit | Patrolled edit
Style & formatting
Wikitext examples | Reference card
HTML in wikitext | HTML elements
List | Table | Sorting
Mathematical symbols on English Wikipedia
Special input and output
Inputbox | Special characters | Displaying a formula | Images and other uploaded files | EasyTimeline