precision.js (2379B)
1 // |reftest| skip-if(!this.hasOwnProperty('Intl')||!Intl.hasOwnProperty("DurationFormat")) 2 3 var df = new Intl.DurationFormat("en", { 4 seconds: "numeric", 5 fractionalDigits: 9, 6 }); 7 8 // 10_000_000 + (1 / 10^9) 9 // = 10000000.000000001 10 var duration = { 11 seconds: 10_000_000, 12 nanoseconds: 1, 13 }; 14 assertEq(df.format(duration), "10000000.000000001"); 15 16 // Number.MAX_SAFE_INTEGER = 9007199254740991 17 var duration = { 18 seconds: Number.MAX_SAFE_INTEGER, 19 }; 20 assertEq(df.format(duration), "9007199254740991.000000000"); 21 22 // Number.MAX_SAFE_INTEGER * 1_000 = 9007199254740990976 23 var duration = { 24 milliseconds: Number.MAX_SAFE_INTEGER * 1_000, 25 }; 26 assertEq(df.format(duration), "9007199254740990.976000000"); 27 28 // Number.MAX_SAFE_INTEGER * 1_000_000 = 9007199254740990951424 29 var duration = { 30 microseconds: Number.MAX_SAFE_INTEGER * 1_000_000, 31 }; 32 assertEq(df.format(duration), "9007199254740990.951424000"); 33 34 // Number.MAX_SAFE_INTEGER * 1_000_000_000 = 9007199254740990926258176 35 var duration = { 36 nanoseconds: Number.MAX_SAFE_INTEGER * 1_000_000_000, 37 }; 38 assertEq(df.format(duration), "9007199254740990.926258176"); 39 40 // 9007199254740991 + (9007199254740991 / 10^3) + (9007199254740991 / 10^6) + (9007199254740991 / 10^9) 41 // = 9.016215470202185986731991 × 10^15 42 var duration = { 43 seconds: Number.MAX_SAFE_INTEGER, 44 milliseconds: Number.MAX_SAFE_INTEGER, 45 microseconds: Number.MAX_SAFE_INTEGER, 46 nanoseconds: Number.MAX_SAFE_INTEGER, 47 }; 48 assertThrowsInstanceOf(() => df.format(duration), RangeError); 49 50 var duration = { 51 seconds: Number.MIN_SAFE_INTEGER, 52 milliseconds: Number.MIN_SAFE_INTEGER, 53 microseconds: Number.MIN_SAFE_INTEGER, 54 nanoseconds: Number.MIN_SAFE_INTEGER, 55 }; 56 assertThrowsInstanceOf(() => df.format(duration), RangeError); 57 58 // 1 + (2 / 10^3) + (3 / 10^6) + (9007199254740991 / 10^9) 59 // = 9.007200256743991 × 10^6 60 var duration = { 61 seconds: 1, 62 milliseconds: 2, 63 microseconds: 3, 64 nanoseconds: Number.MAX_SAFE_INTEGER, 65 }; 66 assertEq(df.format(duration), "9007200.256743991"); 67 68 // (4503599627370497024 / 10^3) + (4503599627370494951424 / 10^6) 69 // = 4503599627370497.024 + 4503599627370494.951424 70 // = 9007199254740991.975424 71 var duration = { 72 milliseconds: 4503599627370497_000, 73 microseconds: 4503599627370495_000000, 74 }; 75 assertEq(df.format(duration), "9007199254740991.975424000"); 76 77 if (typeof reportCompare === "function") 78 reportCompare(true, true);