Fractions en lot


2

Pourquoi le code suivant renvoie-t-il 0?

@echo off
set a=100
set /a a=%a%*(50/%a%)

echo %a%
pause

Je suppose que c'est parce qu'à un moment donné, batch évalue (50/100) la valeur 0,5 et l'arrondit à zéro car il ne peut pas conserver les décimales avant d'évaluer% a% *. Est-ce que je me trompe et comment puis-je contourner cela?

Réponses:


2

Ce que vous essayez de faire est un calcul en virgule flottante avec des valeurs entières. Celles-ci seront toujours forcées en valeurs entières. Cette question concerne la même chose:
https://stackoverflow.com/questions/1503888/floating-point-division-in-a-dos-batch Pour l'
essentiel, vous ne pouvez pas effectuer d'opérations à virgule flottante dans un script batch. Vous devrez utiliser un autre langage ou une autre technologie pour atteindre le résultat souhaité.


1

Pourquoi le code suivant renvoie-t-il 0?

Les fichiers batch ne supportent pas les maths en virgule flottante. Pour contourner cette limitation, vous devez utiliser d'autres langages de script.

Powershell et VBS sont des possibilités:


Math dans les fichiers batch NT

Limites

Il existe une limite sévère au calcul par lots: il ne peut gérer que les entiers 32 bits.

...

Aucune solution de contournement n'autorise les calculs en virgule flottante, à l'exception de l'utilisation d'autres langages de script. La seule exception peut être si vous avez un nombre de décimales limité et fixe (par exemple, 2), vous pouvez simplement tout multiplier par 100. Pour afficher un séparateur décimal dans les résultats finaux, concaténez la division de nombres entiers par 100, suivie du nombre décimal. délimiteur, suivi du modulo diviser par 100:

SET Whole = Result / 100
SET "Fraction = Result %% 100"
SET Result=%Whole%.%Fraction%

Cela peut casser sur la limite de 32 bits, cependant.

En général, pour les maths en virgule flottante, je recommanderais d'utiliser d'autres langages de script.

Source Math dans les fichiers de commandes NT

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.