2

Почему следующий код возвращает 0?

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

echo %a%
pause

Я предполагаю, что это потому, что пакет в какой-то момент оценивает (50/100) как 0,5 и округляет его до нуля, потому что он не может сохранить десятичные дроби до оценки% a% *. Я не прав, и как мне обойти это?

2 ответа2

2

То, что вы пытаетесь сделать, это математика с плавающей точкой с целочисленными значениями. Они всегда будут приводиться к целочисленным значениям. Этот вопрос задает о том же:
https://stackoverflow.com/questions/1503888/floating-point-division-in-a-dos-batch
По сути, вы не можете выполнять операции с плавающей запятой в пакетном скрипте. Вам нужно будет использовать какой-то другой язык / технологию, чтобы достичь желаемого результата.

1

Почему следующий код возвращает 0?

Пакетные файлы не поддерживают математику с плавающей запятой. Чтобы обойти это ограничение, вы должны использовать другие языки сценариев.

Powershell и VBS - это возможности:


Математика в пакетных файлах NT

Ограничения

Существует серьезное ограничение в пакетной математике: она может обрабатывать только 32-разрядные целые числа.

...

Нет реальных обходных путей, позволяющих использовать математику с плавающей запятой, кроме использования других языков сценариев. Единственным исключением может быть, если у вас ограниченное и фиксированное количество десятичных знаков (например, 2), тогда вы можете просто умножить все на 100. Чтобы отобразить десятичный разделитель в конечных результатах, объедините деление Ингера на 100, затем десятичный разделитель и деление по модулю на 100:

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

Это может нарушить 32-битный лимит.

В целом, для математики с плавающей точкой я бы рекомендовал использовать другие языки сценариев.

Исходный Math в пакетных файлах NT

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .