Skip to content

src/base/ScaledInteger.hpp

Utilities for decimal arithmetic using scaled integers. More...

Namespaces

Name
sgns

Classes

Name
class sgns::ScaledInteger
Represents a decimal value using an integer scaled by 10^precision.

Detailed Description

Utilities for decimal arithmetic using scaled integers.

Version: 1.1

Date: 2025-06-10

Copyright: Copyright (c) 2025

Luiz Guilherme Rizzatto Zucchi ([email protected])

Source code

#pragma once

#include <string>
#include <memory>
#include <boost/multiprecision/cpp_int.hpp>
#include "outcome/outcome.hpp"

namespace sgns
{
    class ScaledInteger
    {
    public:
        enum class ParseMode
        {
            Strict,   
            Truncate, 
        };

        static outcome::result<std::shared_ptr<ScaledInteger>> New( uint64_t raw_value, uint64_t precision );

        static outcome::result<std::shared_ptr<ScaledInteger>> New( double value, uint64_t precision );

        static outcome::result<std::shared_ptr<ScaledInteger>> New( const std::string &str,
                                                                    uint64_t           precision,
                                                                    ParseMode          mode = ParseMode::Strict );

        static outcome::result<std::shared_ptr<ScaledInteger>> New( const std::string &str );

        static constexpr uint64_t ScaleFactor( uint64_t precision );

        static outcome::result<uint64_t> FromString( const std::string &str,
                                                     uint64_t           precision,
                                                     ParseMode          mode = ParseMode::Strict );

        static std::string ToString( uint64_t value, uint64_t precision );

        static outcome::result<uint64_t> FromDouble( double value, uint64_t precision );

        static outcome::result<uint64_t> Multiply( uint64_t a, uint64_t b, uint64_t precision );

        static outcome::result<uint64_t> Divide( uint64_t a, uint64_t b, uint64_t precision );

        static outcome::result<uint64_t> ConvertPrecision( uint64_t value, uint64_t from, uint64_t to );

        uint64_t Value() const noexcept;

        uint64_t Precision() const noexcept;

        std::string ToString( bool fixedDecimals = true ) const;

        outcome::result<ScaledInteger> Add( const ScaledInteger &other ) const;

        outcome::result<ScaledInteger> Subtract( const ScaledInteger &other ) const;

        outcome::result<ScaledInteger> Multiply( const ScaledInteger &other ) const;

        outcome::result<ScaledInteger> Divide( const ScaledInteger &other ) const;

        outcome::result<ScaledInteger> ConvertPrecision( uint64_t to ) const;

    private:
        explicit ScaledInteger( uint64_t value, uint64_t precision );

        uint64_t value_;
        uint64_t precision_;
    };

} // namespace sgns

Updated on 2026-03-04 at 13:10:44 -0800