Exercice : est ce que ce nombre est rond ?

Avatar du membre
Mammouth du PHP | 1564 Messages

04 mars 2024, 16:23

Petit exercice (sauf s'il existe une fonction PHP qui sache retourner true si un nombre est rond, comme 10, 200 ou encore 1250).

Comment feriez-vous ?

Mammouth du PHP | 1967 Messages

05 mars 2024, 01:17

$nombre % 10 == 0 ??

Utiliser fmod si on a un float en entrée mais ce sera toujours false :mrgreen:
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Avatar du membre
Mammouth du PHP | 1564 Messages

05 mars 2024, 01:46

Je connais pas bien le modulo mais ça doit fonctionner si tu le propose.

Pour l'exercice, on envoi toujours un un entier.

J'aurais fait :
if(substr( (string) $nombre, -1, 1) == '0')
:lol:

Mammouth du PHP | 2703 Messages

05 mars 2024, 08:04

est-ce que 3000000000000000000000010 est un nombre rond ?

Avatar du membre
Mammouth du PHP | 1564 Messages

05 mars 2024, 08:18

Je pense que oui (la définition du nombre rond est à vérifier...)

Sinon :
if(preg_match("#^[1-9]0+$#", (string) $nombre))

Mammouth du PHP | 2703 Messages

05 mars 2024, 09:15

3569566657136958466956810 l'est aussi ?

Avatar du membre
Mammouth du PHP | 1564 Messages

05 mars 2024, 09:43

Je ne trouve pas de définition du nombre rond... Je pense que oui, dès lors qu'il y ait un 0 ou qu'il soit de 1 à 9.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

05 mars 2024, 11:18

Pour moi, la définition d'un nombre "rond", c'est que c'est un nombre entier (= pas de virgule).
Et PHP a une fonction pour ça qui est is_int : https://www.php.net/is_int

Attention aux limitations inhérentes aux grands nombres, au-delà de 9223372036854775807 is_int() va renvoyer false (nombre entier maximum sur un serveur 64 bits).
S'il est possible que tu dépasses cette limite, alors effectivement, j'utiliserai la regex ^[0-9]+$

(@two3d dans ta regex tu as oublié d'autoriser le zéro ailleurs qu'en dernière position, par exemple 100 ne va pas fonctionner)
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Mammouth du PHP | 1564 Messages

05 mars 2024, 11:43

OK, je pense aussi maintenant qu'un nombre rond est sans virgule, la regex ^[0-9]+$ sera l'idéal.

Super, vous avez pété mon exercice :mrgreen:

Non, c'est très bien, ça permet de savoir ce qu'est finalement un nombre/chiffre rond. J'avais pour besoin de vérifier si un ID était un chiffre à centaines (plutôt que rond, comme je l'ai précisé), je pense m'être mal exprimé.

Prenons exemple du nombre 1800, serait true pour mon exercice.

Il suffirait alors de faire :
if(substr( (string) $nombre, -2, 2) == '00')
ou :
if(preg_match("#^[1-9](?:[0-9]+)?00$#", (string) $nombre))
Ou avec modulo ? Mais ne connais pas bien son fonctionnement.

Mammouth du PHP | 1967 Messages

05 mars 2024, 15:05

J'ai pensé en premier a le traiter comme string et verifier qu'il fini par 0 mais si un chiffre a virgule ou avec séparateur de millier est introduit et nest pas prevu ==> bug

Pour moi un chiffre rond est divisible par 10 donc fini par 10.

Pour tes chiffres centaines
$nombre % 100 == 0
Ou
fmod($nombre, 100) == 0
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Mammouth du PHP | 2703 Messages

05 mars 2024, 17:12

"Nombre qui ne serait pas affecté par un arrondissement. La notion est vague : les nombres pairs sont perçus comme plus ronds que les impairs ; pour les grands nombres, sont ronds ceux qui ont peu de chiffres significatifs."

pour moi, 3569566657136958466956810 et 3000000000000000000000010 ne le sont pas.
3 * 10 ^ 28 est un nombre rond, 3.0000000000000000000000000001 * 10 ^ 28 ne l'est pas.