Welcome to collectivesolver - Programming & Software Q&A with code examples. A website with trusted programming answers. All programs are tested and work.

Contact: aviboots(AT)netvision.net.il

Semrush - keyword research tool

Create your online store today with Shopify

Turn ChatGPT, Claude, Gemini, And CoPilot Into Your Personal Assistant, Business Coach, Content Creator, And More

AFFILIATE MARKETING Your all-in-one performance engine Manage affiliates, creators, and customer referrals in one unified platform—turning every partnership into measurable growth

Secure & Reliable Web Hosting, Free Domain, Free SSL, 1-Click WordPress Install, Expert 24/7 Support

Disclosure: My content contains affiliate links.

43,563 questions

56,781 answers

573 users

How to get the Nth digit after the decimal point of a floating-point number in Pascal

1 Answer

0 votes
program GetNthDecimalDigit;

{$mode objfpc}{$H+}

uses
  SysUtils, Math;

{
  Returns the Nth digit after the decimal point.

  Parameters:
    Value    - Floating-point number to inspect.
    Position - Digit position after the decimal point (1-based).

  Returns:
    The requested digit (0..9).

  Notes:
    - Returns 0 if the digit does not exist.
    - Raises an exception if Position is less than 1.
}
function GetNthDecimalDigit(const Value: Double;
                            const Position: Integer): Integer;
var
  NumberStr: String;
  DecimalPos: Integer;
  DigitIndex: Integer;
begin
  if Position < 1 then
    raise Exception.Create(
      'Position must be greater than zero.');

  {
    Convert the absolute value to a string.

    ffFixed     = fixed-point notation
    18          = total significant digits
    15          = digits after decimal point
  }
  NumberStr := FloatToStrF(
    Abs(Value),
    ffFixed,
    18,
    15
  );

  { Find decimal separator }
  DecimalPos := Pos(FormatSettings.DecimalSeparator,
                    NumberStr);

  if DecimalPos = 0 then
  begin
    Result := 0;
    Exit;
  end;

  { Index of the requested digit }
  DigitIndex := DecimalPos + Position;

  if DigitIndex > Length(NumberStr) then
  begin
    Result := 0;
    Exit;
  end;

  Result := Ord(NumberStr[DigitIndex]) - Ord('0');
end;

var
  Number: Double;
  I: Integer;
begin
  Number := 123.456789;

  WriteLn('Number: ', FormatFloat('0.000000', Number));
  WriteLn;

  for I := 1 to 6 do
  begin
    WriteLn(
      I,
      ' digit after decimal = ',
      GetNthDecimalDigit(Number, I)
    );
  end;

  WriteLn;
  WriteLn('Additional Examples');
  WriteLn('-------------------');

  WriteLn(
    '123.456789, position 4 -> ',
    GetNthDecimalDigit(123.456789, 4)
  );

  WriteLn(
    '-98.7654, position 2 -> ',
    GetNthDecimalDigit(-98.7654, 2)
  );

  WriteLn(
    '1.2, position 5 -> ',
    GetNthDecimalDigit(1.2, 5)
  );
end.



{
run:

Number: 123.456789

1 digit after decimal = 4
2 digit after decimal = 5
3 digit after decimal = 6
4 digit after decimal = 7
5 digit after decimal = 8
6 digit after decimal = 9

Additional Examples
-------------------
123.456789, position 4 -> 7
-98.7654, position 2 -> 6
1.2, position 5 -> 0

}

 



answered 1 day ago by avibootz

Related questions

...