разложить число с плавающей точкой

123

Guest
разложить число с плавающей точкой

К примеру имеется число 2.34

мне нужно его разложить, чтобы запихнуть первую часть до точки в одну переменную, а вторую в во вторую

Тоесть:

$a1 должна содержать 2
$a2 должна содержать 34

Как ето сделать быстрее и оптимальнее
 

baev

‹°°¬•
Команда форума
Привести в строку.
Дальше -- смотреть строковые функции ("с ходу" лично я пользовал бы explode, но не уверен в "оптимальности"...).
 

mani13

Новичок
bgm
ответ неверный :)
посмотри на свои $a1, $a2 и на то, что в примере
 

123

Guest
Умный вариант предложил bgm, его я поддерживаю, но тогда появляется две проблемы

первая, как и говорилось - избавиться от нуля (я имею ввиду возможность не строковыми функциями)

а вот вторая: к примеру есть число 22.50
мне нужно, чтобы остаток остался 50, а не 5 (ноль не должен убираться)
 

netdog

net @
+1 за explode.

-~{}~ 21.07.05 00:49:

первая, как и говорилось - избавиться от нуля (я имею ввиду возможность не строковыми функциями)
тебя чем-то строковые ф-ии не устраивают? :)
 

123

Guest
explode пока не пойдет:

перед разложением числа у меня идут выражения, например такое:

$a = 25.60 * 1;
$a теперь = не 25.60, а 25.6
требуется же 25.60 (идет рассчет копеек, поэтому это важно)
как это обыграть?
 

algo

To the stars!
В духе ООП..

Мое ООП решение, разумеется, в недостаточной степени использует шаблоны проектирования: состояние не вынесено вне объекта, отсутствует абстрактная фабрика, и даже паттерн команда остался вне внимания.

Допиши, что считаешь необходимым..
PHP:
/**
* Класс для декомпозиции объектов
*/
abstract class GenericDecomposer {
  protected $data;

  public function getDecomposed() {
    $result = $this->decompose($this->data);
    if ($result === null) {
      throw new DecompositionFailedException;
    }
    return $result;
  }

  protected abstract function decompose();

  public function setData($data) {
    $this->data = $data;
  }

  public function __construct($data = null) {
    $this->setData($data);
  }
}

/**
* Разложить число на целую и дробную часть 
*
* @TODO: wrap both parts into DecomposedNumber object
*/
class NumberDecomposer extends GenericDecomposer {
  protected function decompose() {
    if (!$this->data || !is_numeric($this->data)) {
      throw new NumberFormatException;
    }

    $floor = floor($this->data);
 
    return array ($floor, $this->data - $floor);
  }
}
 

123

Guest
угу, но это опять же только первое решение проблемы - с разложением.

А как мне сохранить ноль, о котором я говорил в предыдущем сообщении
 

SiMM

Новичок
> Умный вариант предложил bgm, его я поддерживаю
Если он (вариант) такой умный, по почему же
> тогда появляется две проблемы
?
Тебе правильно baev сказал - но кто ж виноват, что мальчик ты у нас из тех, кто не может решить задачу в два действия?

algo, не кури больше эту траву.

> А как мне сохранить ноль, о котором я говорил в предыдущем сообщении
Никак. Потому что никакого нуля нет.
PHP:
echo 25.60;
Единственное решение задачи - это если число знаков после запятой заранее известно - тогда, как уже сказали, sprintf (с money_format предлагаю разбираться самостоятельно)
PHP:
list($a1,$a2) = explode('.',sprintf('%.2f',25.60));
echo $a1."\n".$a2;
PS: это ж надо из такой мухи при уже первом правильном ответе раздуть такого слона с туевой хучей постов.
 

lucas

Guest
Добавлю для тех, кто не желает использовать строковые функции:

2.34 - 0.34 != 2.(0)

Hint: см. представления чисел в разных системах счисления.
 
Сверху