Softanza
StartFrançais
Softanza
Reference · stzNumber

WhyNotExact()

Empty when the value is exact; otherwise a plain sentence saying what was lost and where.

also: why not exact what was lost explain the precision

also written: Why

Basic examples (2)

Softanza
oT = StzNumberQ("1")
oT.Divide("3")
? oT.Content()
? oT.IsExact()
? oT.WhyNotExact()
Output
0.333333
0
the division does not terminate in 6 decimal place(s)

run on 2026-10-02 04:25 inside the library at commit 0e72e2e2c; taken from 07-a-number-that-says-why.en.md(opens in a new tab)

Softanza
# 1 / 8 is 0.125
? (new stzNumber("1")).DivideQ("8").Content()
# 0.1 / 4 is 0.025
? (new stzNumber("0.1")).DivideQ("4").Content()
# 10 / 4 is 2.5
? (new stzNumber("10")).DivideQ("4").Content()
# 22 / 5 is 4.4
? (new stzNumber("22")).DivideQ("5").Content()
oThird = new stzNumber("1")
oThird.Divide("3")
# 1 / 3 does NOT claim to be exact
? oThird.IsExact()
# ...and says why
? StzFindFirst("does not terminate", oThird.Why()) > 0
Output
0.125
0.025
2.5
4.4
0
1

run on 2026-10-02 04:23 inside the library at commit 0e72e2e2c; taken from numeric_exactness_narrated.ring(opens in a new tab)

Scope (1)

Softanza
# an exact product knows it
? (new stzNumber("19.99")).MultiplyByQ("0.15").IsExact()
# ...with nothing to explain
? (new stzNumber("19.99")).MultiplyByQ("0.15").Why()
# a big-integer sum knows it
? (new stzNumber("9007199254740992")).AddQ(1).IsExact()
oSqrt = new stzNumber("2")
oSqrt.SquareRoot()
# a square root does not pretend
? oSqrt.IsExact()
# ...and names the reason
? StzFindFirst("no exact decimal result", oSqrt.Why()) > 0
# IsApproximate is its mirror
? oSqrt.IsApproximate()
# Exactness() reports the register
? oSqrt.Exactness()
Output
1

1
0
1
1
inexact

run on 2026-10-02 04:23 inside the library at commit 0e72e2e2c; taken from numeric_exactness_narrated.ring(opens in a new tab)

The extensions of this method

Each extension, and whether it exists for this method; an extension that exists combines with the others (FindSTCS).

Extension
Exists
What it adds · The names
Q
no
does what the method does, then returns the object, so the call can be chained
QQ
no
chains on the next, more specific type of object (the Q ladder)
QQQ
no
chains on the most specific type of object (the Q ladder)
QRT
no
returns the result as an object of the requested type
CS
no
takes a case-sensitivity flag
ST
no
takes the position to start from (StartingAt)
IB
no
takes bounds that are included (IncludingBounds)
XT
no
the extended form: more parameters than the base method
XTT
no
yet another extension: a further extended form, after XT
Z
no
includes the position in what it returns
ZZ
no
returns positions as sections, [start, end]
W
no
selects by a condition
WF
no
selects by a condition, with the expressive keywords (@NextItem, @PreviousItem...)
D
no
takes a direction, forward or backward (Directional)
F
no
takes a function (the condition or the update is given as a function); the forms document also uses F for the future form, which defers the action
Many
no
works on a collection of items instead of one (the plural form)
Except
no
takes exceptions, what to leave out (the exceptional form)
U
no
returns the result without duplication

Every example is a test file of the library, run inside the library for this page; only those whose output kept every promise their file wrote are shown.

See also