this post was submitted on 25 Sep 2023
13 points (69.7% liked)

Programming

17496 readers
45 users here now

Welcome to the main community in programming.dev! Feel free to post anything relating to programming here!

Cross posting is strongly encouraged in the instance. If you feel your post or another person's post makes sense in another community cross post into it.

Hope you enjoy the instance!

Rules

Rules

  • Follow the programming.dev instance rules
  • Keep content related to programming in some way
  • If you're posting long videos try to add in some form of tldr for those who don't want to watch videos

Wormhole

Follow the wormhole through a path of communities [email protected]



founded 1 year ago
MODERATORS
 

What is %.2f? Why is it not just %f? Is there some additional calculation happening? The half function already does all the calculations including splitting the bill, so I'm not sure what %.2f is. (Btw why is this code not formatting correctly in lemmy?)


#include 
#include 

float half(float bill, float tax, int tip);

int main(void)
{
    float bill_amount = get_float("Bill before tax and tip: ");
    float tax_percent = get_float("Sale Tax Percent: ");
    int tip_percent = get_int("Tip percent: ");

    printf("You will owe $%.2f each!\n", half(bill_amount, tax_percent, tip_percent));
}

// TODO: Complete the function
float half(float bill, float tax, int tip)
{
    bill += (bill * (tax / 100.0));
    bill += (bill * (tip / 100.0));

    bill /= 2;

    return bill;
}
all 36 comments
sorted by: hot top controversial new old
[–] [email protected] 24 points 1 year ago* (last edited 1 year ago)

Please put your code between tripple backticks in a seperate line above an below your code. Single backticks are only for inline code like this.

To answer your question, the %.2f means it should only print two digits after the decimal point.

You can also use some other variations like this:

  • %2f print the number at least 2 characters wide
  • %5.2 print the number at least 5 characters wide with a precision of two digits after the decimal point
  • %05.2 the same as above, but fill leading digits with zeros

This is just formatting, play a bit around with it and you will get it.

[–] [email protected] 15 points 1 year ago (2 children)

It's a decimal floating point specifier with a precision sub-specifier.

https://cplusplus.com/reference/cstdio/printf/

[–] [email protected] 8 points 1 year ago* (last edited 1 year ago)

Example with pi.

#define PI 3.1415926

int main() {
  printf("%.2f", PI); // prints 3.14
  return 0;
}
[–] [email protected] 9 points 1 year ago

%.2f% means it will format to two decimal places max. So 5.877 will format as 5.88 and 1 will format as 1.00.

[–] [email protected] 8 points 1 year ago (1 children)
[–] GuybrushThreepwo0d 2 points 1 year ago

This is the way

[–] [email protected] 5 points 1 year ago* (last edited 1 year ago) (2 children)

If you want multi-line code, you need to put it like this:

For these kinds of questions, your best friend is the documentation. In particular, a man 'printf(3)' yields:

Format of the format string

The format string is a character string, beginning and ending in its initial shift state, if any. The format string is composed of zero or more directives: ordinary characters (not %), which are copied unchanged to the output stream; and conversion specifications, each of which results in fetching zero or more subsequent arguments. Each conversion specification is introduced by the character %, and ends with a conversion specifier. In between there may be (in this order) zero or more flags, an optional minimum field width, an optional precision and an optional length modifier.

The overall syntax of a conversion specification is:

%[$][flags][width][.precision][length modifier]conversion

[–] PoolloverNathan 3 points 1 year ago (1 children)

Wouldn't man 3 printf do the same thing without the quotes?

[–] [email protected] 1 points 1 year ago (2 children)

Yup that definitely does the same thing.

If anyone else is wondering why the 3 is there, it's because usually you won't find just one printf. You have the printf user command, the printf function from the standard C library, and POSIX manual entries for both the printf user command and C function. The id number is then an identifier for the corresponding section of the printf entry, and you can list all of them by doing a man -f printf.

[–] JackbyDev 1 points 1 year ago

Awesome, I think I'm gonna consider aliasing man to man -f lol. Can you think of any compelling reason not to?

Actually, nevermind, I misunderstood you. -f just lists the pages, it doesn't print all of their content.

[–] [email protected] 1 points 1 year ago (1 children)

The id number is then an identifier for the corresponding section of the printf entry,

Nit: 3 is the manual section in which to look for the named entry (aka page), not a section of the entry.

[–] [email protected] 1 points 1 year ago

Wrote it in an awkward way but yeah I meant to say the section where you can find the corresponding entry 😬

[–] starman 2 points 1 year ago* (last edited 1 year ago) (4 children)

Wait, you can use man on C functions?

[–] [email protected] 4 points 1 year ago (1 children)

On libc functions yes. Maybe on some from other libs, if they provide man pages.

[–] starman 1 points 1 year ago

That's nice.

[–] [email protected] 2 points 1 year ago (1 children)

Yup! Try also man malloc 😁

[–] starman 2 points 1 year ago
[–] [email protected] 2 points 1 year ago* (last edited 1 year ago)

You can if you have those man pages installed.

You might also enjoy man ascii, man operator, or even man intro.

Unfortunately, there are still some gaps:

$ man love
No manual entry for love
[–] [email protected] 1 points 1 year ago

Back in my day, MS-DOS let you use HELP on QBASIC commands.

[–] [email protected] 5 points 1 year ago

This formats the number with 2 decimals behind the dot.

[–] [email protected] 2 points 1 year ago* (last edited 1 year ago)

%.2f will format your number rounded to two decimal places. So if you had 1 / 3 it would come out as 0.33 instead of 0.333333

% is the placeholder for the value

.2 tells it 'two spaces after the decimal'

f tells it that the placeholder is a float

[–] [email protected] 1 points 1 year ago

The .2f just means the float displays with only 2 significant figures ie cents.