CUE defines two types of numbers, integers and floats, and various syntactic sugar for their literal representations.

Integers, denoted int, are whole (or integral) numbers. Floats, denoted float, are decimal floating point numbers. Both integers and floats are instances of the generic number type. CUE numbers have arbitrary precision.

An integer literal (e.g. 4) is only compatible with int.
A floating point literal (e.g. 5.0) is only compatible with float, even if it is a whole number.

file.cue
a: 4 & int      // int type
b: 5.0 & float  // float type
c: 4 & number   // int type
d: 5.0 & number // float type
e: 4 & float    // Type mismatch
f: 5.0 & int    // Type mismatch

// Syntactic sugar for numeric literals.
s: [
	// ints
	1_234,       // 1234
	5M,          // 5_000_000
	1.5Gi,       // 1_610_612_736
	0x1000_0000, // 268_435_456
	1e6,         // 1_000_000

	// floats
	000072.40,   // 72.40
	6.67428e-11, // 0.0000000000667428
]
TERMINAL
$ cue eval -i file.cue
a: 4
b: 5.0
c: 4
d: 5.0
e: _|_ // e: conflicting values 4 and float (mismatched types int and float)
f: _|_ // f: conflicting values 5.0 and int (mismatched types float and int)
s: [1_234, 5M, 1.5Gi, 0x1000_0000, 1e6, 000072.40, 6.67428e-11]