remove from float

This commit is contained in:
Sebastian 2023-06-20 11:50:04 -03:00
parent ac9b4bfd0e
commit 9f07ab8d4a
No known key found for this signature in database
GPG Key ID: 173909D1A5F66069
2 changed files with 43 additions and 19 deletions

View File

@ -147,8 +147,10 @@ export class Amounts {
throw Error(`incompatible currency (${am1.currency} vs${am2.currency})`);
}
const x1 = BigInt(am1.value) * BigInt(amountFractionalBase) + BigInt(am1.fraction);
const x2 = BigInt(am2.value) * BigInt(amountFractionalBase) + BigInt(am2.fraction);
const x1 =
BigInt(am1.value) * BigInt(amountFractionalBase) + BigInt(am1.fraction);
const x2 =
BigInt(am2.value) * BigInt(amountFractionalBase) + BigInt(am2.fraction);
const quotient = x1 / x2;
const remainderScaled = x1 % x2;
@ -158,9 +160,9 @@ export class Amounts {
remainder: {
currency: am1.currency,
value: Number(remainderScaled / BigInt(amountFractionalBase)),
fraction: Number(remainderScaled % BigInt(amountFractionalBase))
}
}
fraction: Number(remainderScaled % BigInt(amountFractionalBase)),
},
};
}
static sum(amounts: AmountLike[]): Result {
@ -391,20 +393,6 @@ export class Amounts {
}
}
/**
* Convert a float to a Taler amount.
* Loss of precision possible.
*/
static fromFloat(floatVal: number, currency: string): AmountJson {
return {
currency,
fraction: Math.floor(
(floatVal - Math.floor(floatVal)) * amountFractionalBase,
),
value: Math.floor(floatVal),
};
}
static min(a: AmountLike, b: AmountLike): AmountJson {
const cr = Amounts.cmp(a, b);
if (cr >= 0) {

View File

@ -187,6 +187,31 @@ interface GetPlanForWalletInitiatedOperation {
mode: TransactionAmountMode;
}
export interface ConvertAmountRequest {
amount: AmountString;
type: TransactionAmountMode;
}
export const codecForConvertAmountRequest =
buildCodecForObject<ConvertAmountRequest>()
.property("amount", codecForAmountString())
.property(
"type",
codecForEither(
codecForConstString(TransactionAmountMode.Raw),
codecForConstString(TransactionAmountMode.Effective),
),
)
.build("ConvertAmountRequest");
export interface GetAmountRequest {
currency: string;
}
export const codecForGetAmountRequest = buildCodecForObject<GetAmountRequest>()
.property("currency", codecForString())
.build("GetAmountRequest");
interface GetPlanToCompleteOperation {
instructedAmount: AmountString;
}
@ -328,6 +353,17 @@ export const codecForGetPlanForOperationResponse =
.property("counterPartyAmount", codecOptional(codecForAmountString()))
.build("GetPlanForOperationResponse");
export interface AmountResponse {
effectiveAmount: AmountString;
rawAmount: AmountString;
}
export const codecForAmountResponse = (): Codec<AmountResponse> =>
buildCodecForObject<AmountResponse>()
.property("effectiveAmount", codecForAmountString())
.property("rawAmount", codecForAmountString())
.build("AmountResponse");
export interface Balance {
scopeInfo: ScopeInfo;
available: AmountString;