Skip to content

Instantly share code, notes, and snippets.

@cristobal
Last active December 2, 2021 13:55
Show Gist options
  • Save cristobal/20f3ec5040657203efd285042eb8e16b to your computer and use it in GitHub Desktop.
Save cristobal/20f3ec5040657203efd285042eb8e16b to your computer and use it in GitHub Desktop.
import { u128 } from 'near-sdk-as';
/**
* Hack to expand f64 vales represented with exponent to a string
* that can be parsed via u128.fromString(value) e.g.:
* - 1.0e+23 is expanded to 100000000000000000000000
* - 2.5e+23 is expanded to 250000000000000000000000
*/
function parseF64ValueToString(value: f64): string {
const repr = value.toString();
if (repr.indexOf('e+') < 0) {
return repr;
}
const elements = repr.split('e+');
const val = elements[0];
const args = [
val.charAt(0)
];
let stop = val.indexOf('0') > 0
? val.indexOf('0')
: val.length;
for (let i = 2; i < stop; i++) {
args.push(val.charAt(i));
}
const exp = parseInt(elements[1]) as i32;
stop = exp - (args.length - 1);
for (let i = 0; i < stop; i++) {
args.push('0');
}
return args.join('');
}
export function small_values_ok():u128[] {
return [
u128.fromF64(parseFloat('10') as f64),
u128.fromF64(parseFloat('100') as f64),
u128.fromF64(parseFloat('1000') as f64),
u128.fromF64(parseFloat('10000') as f64),
u128.fromF64(parseFloat('100000') as f64),
u128.fromF64(parseFloat('10000000') as f64)
]
}
export function large_values_from_f64_fails_with_error(): u128[] {
return [
u128.fromF64(
parseFloat('1000000000000000000000000') as f64
)
]
}
export function large_values_from_f64_string_to_wrong_values(): u128[] {
return [
u128.fromString(
(parseFloat('1000000000000000000000000') as f64).toString()
),
u128.fromString(
(parseFloat('2500000000000000000000000') as f64).toString()
)
]
}
export function large_values_ok(): u128[] {
return [
u128.fromString(
parseF64ValueToString(
parseFloat('1000000000000000000000000') as f64
)
),
u128.fromString(
parseF64ValueToString(
parseFloat('2500000000000000000000000') as f64
)
)
]
}
export function large_values_repr():string[] {
return [
(parseFloat('1000000000000000000000000') as f64).toString(),
(parseFloat('2500000000000000000000000') as f64).toString()
]
}
export function large_values_repr_parsed():string[] {
return [
parseF64ValueToString(
parseFloat('1000000000000000000000000') as f64
),
parseF64ValueToString(
parseFloat('2500000000000000000000000') as f64
)
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment